fork()函數的總結

fork函數包含在頭文件 #include<unistd.h> 中

fork函數用於創建一個新進程,稱爲子進程,它與進程(稱爲系統調用fork的進程)同時運行,此進程稱爲父進程。創建新的子進程後,兩個進程將執行fork()系統調用之後的下一條指令。子進程和父進程的執行順序不確定,不是說誰一定先執行。

子進程使用相同的pc(程序計數器),相同的CPU寄存器,在父進程中使用的相同打開文件。 

fork函數是有返回值的,父進程的fork()的返回值是子進程的pid ,而子進程的fork()的返回值是 0(可以理解爲子進程沒有它的子進程所以返回值是0),還有可能返回值是 -1,這代表fork()出現了錯誤。

錯誤的原因有三種可能:

1) 系統內存不夠

2) 進程表滿(容量一般爲 200~400)

3) 用戶的子進程太多(一般不超過 25 個)

示例1:

#include<unistd.h>
int main(){
        pid_t fpid;
        int count = 0;
        fpid = fork();
        if(fpid<0){
                printf("Error !\n");
        }else if(fpid == 0){
                printf("Son process ! Pid = %d\n",getpid());
                count++;
        }else{
                printf("Father process ! Pid = %d\n",getpid());
                count++;
        }
        printf("count = %d\n",count);
        return 0;
}

結果: 

 

示例2:

#include<unistd.h>
#include<stdio.h>
int main(){
        int i = 0;
        for(i = 0;i < 3;i++){
                pid_t fpid = fork();
                if(fpid == 0)
                        printf("Son\n");
                else
                        printf("Father\n");
        }       
        return 0;
}      

結果:

實例3:

請畫出一下代碼運行後的進程關係

fork()
fork()
fork()
fork()

實例四:

 

要求父進程產生兩個子進程,父進程輸出從1到6 ,子進程1 輸出從a 到 f ,子進程2 輸出從 A 到 F,要求按aA1類似的交替輸出

 

#include<stdio.h>
#include<unistd.h>
int main(){
        int p = fork();
        int q;
        if(p){
                q = fork();
                if(q){
                     int i=1;
                     printf("this is the father! Pid = %d\n", getpid());
                     while(i<=6){
                             printf("%d",i++);
                             fflush(stdout);
                             sleep(1);
                     }
                }else{
                     char c='a';
                     printf("this is child2 ! pid = %d\n" ,getpid());
                     while(c<='f'){
                             printf("%c\n",c++);
                             sleep(1);}
                }
        }else{
             char c='A';
             printf("this is child1 ! pid = %d\n",getpid());
             while(c<='F'){
                     printf("%c\n",c++);
                     sleep(1);}
        }
        return 0;
}

這裏如果沒有再輸出後面加上"\n"的話是不會交替輸出的,而還是整個進程整個進程的輸出,當加上"\n"是纔可以交替輸出。這裏"\n"的作用就是刷新行緩衝區,

行緩衝,大小是一行,加了回車就是一行了

Fflush(stdout)函數的作用也是清空緩衝區

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章