2015-10-01 79 views
-3

我在使用fork函數時遇到問題。我想編寫一個程序,C程序子進程在父進程之前再次擦除

  • 派生四個過程
  • 打印每個進程的PID,地重複印刷的PID
  • 打印父母的PID

但是,當最後一個子進程結束我不能跳回到第一個子進程,只打印最後一個孩子的PID。如何在父進程之前再次運行子進程?

int noOfPlayer=4; 
int pid,myid,status,grandchild; 
int i=0; 
int a=1; 
int x=1; 
myid = getpid(); 

for(i=0;i<noOfPlayer;i++){ 

    pid=fork(); 
    if(pid<0){ //error occurred 
     printf("Fork Failed\n");exit(1); 
    } else if (pid==0) {//child process 
     myid=getpid(); 
     printf("Child %d, pid %d\n",i+1,myid); 

     printf("ABC Child %d, pid %d\n",i+1,myid); 


     exit(0); 

    } else { //parent process 

     wait(NULL); 



    } 
} 
printf("I am parent, pid %d: all children finished\n", myid); 


結果是
兒童1,PID 21989
ABC兒童1,PID 21989
兒童2,PID 21990
ABC兒童2,PID 21990
兒童3,PID 21991
ABC孩子3,孩子21991
孩子4,孩子21992
孩子4,孩子21992
我的父母,PID 21988:所有的孩子完成

但我想
兒童1,PID 21989
兒童2,PID 21990
兒童3,PID 21991
兒童4,PID 21992
ABC子1,PID 21989
ABC子2,PID 21990
ABC子3,PID 21991
ABC子4,PID 21992

+2

對我不太清楚。你有一些代碼給我們看? –

+0

「跳回第一個孩子的過程」是什麼意思? – Downvoter

+0

您的輸出是可預測的,因爲您一次只運行一個子進程(父進程等待每個進程退出)。無論如何,你可能想在循環外面「wait()」。這仍然可能不會給你你期望的輸出(因爲孩子之間沒有訂單保證,並且標準輸出可能被緩衝) – Hasturkun

回答

0

如y ou分離出一個新的流程(或針對該問題的新線程),它完全獨立於父母和父母可能分配的任何其他子女。一般來說,您不能對語句的執行順序做任何保證。

爲了得到你想要的結果,必須有某種孩子之間的同步方法。您可以讓每個孩子打印第一行,向父母發送信號,然後在打印第二行之前等待信號。家長然後等待所有四個孩子的信號,然後發送一個信號給每個孩子。

這將是清潔用單獨的線,而不是單獨的進程來做到這一點。在這種情況下,可以使用互斥體在線程之間進行同步。

+0

謝謝,你能給我一個示例代碼嗎? –

0

我想我現在更好地理解你現在要做什麼。你應該考慮的是使用Pipe或者其他形式的進程間通信來減慢進程,以便在你準備好之前不會丟掉所有的東西。