2.1 進程控制之fork創建子進程


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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM