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 設置跟蹤父進程
注意:在有多個子進程時,能夠在相應的子進程處設置(條件)斷點。