fork同時建立多個子程式的方法

期待一片自己的藍天發表於2014-06-29

Fork同時建立多個子程式方法

 

 

第一種方法:驗證通過 

特點:同時建立多個子程式,每個子程式可以執行不同的任務,程式 可讀性較好,便於分析,易擴充套件為多個子程式 

int main(void) 

printf("before fork(), pid = %d\n", getpid()); 

pid_t p1 = fork(); 

if( p1 == 0 )

printf("in child 1, pid = %d\n", getpid()); 

return 0; //若此處沒有return 0 p1 程式也會執行 pid_t p2=fork()語句

pid_t p2 = fork(); 

if( p2 == 0 ) 

printf("in child 2, pid = %d\n", getpid()); 

return 0; //子程式結束,跳回父程式

Printf("hello world\");//沒有列印

}

int st1, st2; 

waitpid( p1, &st1, 0); 

waitpid( p2, &st2, 0); 

printf("in parent, child 1 pid = %d\n", p1); 

printf("in parent, child 2 pid = %d\n", p2); 

printf("in parent, pid = %d\n", getpid()); 

printf("in parent, child 1 exited with %d\n", st1); 

printf("in parent, child 2 exited with %d\n", st2); 

return 0; 

 

 

第二種方法: 驗證通過 

特點:同時建立兩個子程式,結構比較繁瑣,程式可讀性不好,不易擴充套件 

 

#include<stdio.h> 

#include<unistd.h> 

#include<sys/types.h> //這個標頭檔案不能少,否則pid_t沒有定義 

main() 

printf("This is parent process%d\n",getpid()); 

pid_t p1,p2; 

if((p1=fork())==0)

printf("This is child_1 process%d\n",getpid()); 

}

Else

if((p2=fork())==0)

printf("This is child_2 process%d\n",getpid()); 

}

Else

wait(p1,NULL,0); 

wait(p2,NULL,0); 

printf("This is parent process%d\n",getpid()); 

 

 

第三種方法:for 迴圈方法 

特點:其實每次迴圈只是建立了單個程式,並沒有同時建立多個程式 

#include<stdio.h> 

#include<unistd.h> 

#include<sys/types.h> 

main() 

{

printf("This is parent process%d\n",getpid()); 

pid_t p1,p2; 

int i; 

for(i=0;i<=2;i++)

if((p1=fork())==0)

printf("This is child_1 process%d\n",getpid()); 

return 0;//這個地方非常關鍵 

wait(p1,NULL,0); //父程式等待p1子程式執行後才能繼續fork其他子程式

printf("This is parent process%d\n",getpid()); 

}

注意:標註的 return 0 對程式結果影響很大 

 

無 return 0 情況 

 

#include<stdio.h> 

#include<unistd.h> 

#include<sys/types.h> 

main() 

printf("This is parent process%d\n",getpid()); 

pid_t p1,p2; 

int i; 

for(i=0;i<=2;i++)

if((p1=fork())==0)

printf("This is child_1 process%d\n",getpid()); 

//return 0;//這個地方非常關鍵 

wait(p1,NULL,0); 

printf("This is parent process%d\n",getpid()); 

}

結論:父程式會生成 n(n+1)/2+1個子程式,為迴圈次數,本例中共有 個子程式, 但實際上只有 個是父程式產生的,其餘都為子程式 fork()出來的。父程式fork3個程式,第一個子程式執行完之後又fork2個程式,第2個子程式fork1個程式。

 

 

 

正確的使用Linux中的用fork()由一個父程式建立同時多個子程式 的格式如下:

 

int status,i;

for (i = 0; i < 10; i++)

{

  status = fork();

  if (status == 0 || status == -1) break;//每次迴圈時,如果發現是子程式就直接從建立子程式的迴圈中跳出來,不讓你進入迴圈,這樣就保證了每次只有父程式來做迴圈建立子程式的工作

}

if (status == -1)

{

  //error

}

else if (status == 0) //每個子程式都會執行的程式碼

{

  //sub process

}

else

{

  //parent process

}

 

相關文章