fork()函數
目標:熟悉fork創建一個和多個子進程子線程
函數原型:pid_t fork(void);
返回值:成功返回:① 父進程返回子進程的ID(非負) ②子進程返回 0 ;
失敗返回-1。
注意:pid_t類型表示進程ID,它是有符號整型。
例程一:創建一個子線程
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 int main(void) 5 { 6 pid_t pid; 7 pid = fork();//創建子進程 8 //調用出錯 9 if(pid == -1){ 10 printf("fork failed\n"); 11 return 1; 12 } 13 else if(pid){ //返回值大於0,為父進程 14 printf("The father return value is %d\n",pid); 15 printf("The father pid is %d\n",getpid()); 16 printf("The father ppid is %d\n",getppid()); 17 sleep(2); 18 } 19 else{ //返回值等於0,為子進程 20 printf("The child return value is %d\n",pid); 21 printf("The child pid is %d\n",getpid()); 22 printf("The child ppid is %d\n",getppid()); 23 } 24 return 0; 25 }
編譯執行結果:
例程二:循環創建多個子線程
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 int main(void) 6 { 7 int i; 8 pid_t pid; 9 for (i = 0; i < 5; i++) { 10 pid = fork(); 11 if (pid == 0) { //若為子進程則直接break退出 12 break; 13 } 14 } 15 16 if (i < 5) { //子進程部分 18 sleep(i); 19 printf("I'am %d child , pid = %u\n", i+1, getpid()); 20 21 } else { //父進程 22 sleep(i); 23 printf("I'm parent\n"); 24 } 25 return 0; 26 }
編譯執行結果:
其中,getpid()函數: 獲取當前進程ID,原型為pid_t getpid(void);
getppid()函數:獲取當前進程的父進程ID,原型為pid_t getppid(void);