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)函數的作用也是清空緩衝區