進程控制

1.fork函數函數

做用:建立一個子進程ui

函數原型:pid_t fork();spa

返回值:設計

  兩個返回值,一個是父進程的返回值,其值爲子進程的進程id;一個是子進程的返回值,爲0表明建立成功,-1表明建立失敗。調試

循環建立n個進程:code

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 
 5 int main()
 6 {
 7         int i;
 8         pid_t pid;
 9         for(i=0;i<5;i++){
10                 pid = fork();
11                 if(pid == -1){
12                         perror("fork error");
13                         exit(1);
14                 }else if(pid == 0){
15                         break;
16                 }
17         }
18 
19         if(i<5){
20                 sleep(i);
21                 printf("I'm %d child,pid = %u\n",i+1,getpid());
22         }else{
23                 sleep(i);
24                 printf("I'm parent\n");
25         }
26         return 0;
27 }

 

2.一些相關函數blog

pid_t getpid(void);進程

獲取當前進程的id內存

pid_t getppid(void);get

獲取當前進程的父進程的id

 

uid_t getuid(void);

獲取當前進程實際用戶id

uid_t geteuid(void);

獲取當前進程有效用戶id

例:sudo apt-get install

有效用戶爲su,而不是當前用戶。

 

gid_t getgid(void);

獲取當前進程使用用戶組id

gid_t getegid(void);

獲取當前進程有效用戶組id

 

3.進程共享

  fork以後,父子進程的相同與不一樣之處以下:

  相同處:全局變量(父子不共享)、.data(數據段)、.text(代碼段)、棧、堆、環境變量、用戶id、宿主目錄、進程工做目錄、信號處理方式;

  不一樣處:進程id、fork返回值、父進程id、進程運行時間、鬧鐘(定時器)、未決信號集;

  當前父子進程之間遵循讀時共享寫時複製的原則,這樣設計,不管子進程執行父進程的邏輯仍是本身的邏輯都能節省內存。

  父子進程之間共享:1.文件描述符(打開文件的結構體);2.mmap創建的映射區

 

4.gdb調試

  使用gdb調試的時候,gdb只能跟蹤一個進程,能夠在fork函數調用以前,經過指令設置gdb跟蹤父進程或子進程,默認跟蹤父進程。

  set follow-fork-mode child 設置跟蹤子進程

  set follow-fork-mode parent 設置跟蹤父進程

  注意:在有多個子進程時,能夠在相應的子進程處設置(條件)斷點。

相關文章
相關標籤/搜索