2016-11-16 68 views
0

我是一種新的所有forkexecwait功能。我有一個任務,這需要我的主要過程我需要時間,然後使用所有的孩子爲每個過程寫入不同的fifos。例如,如果我有3個孩子,我將不得不寫3個不同的fifos。然後,我的父進程必須等待第一個完成寫在任何fifo,並從該特定的fifo讀取數據。讓我感到困惑的是,我的父進程必須等待第一個完成,而不是等待所有進程完成。如果我必須等待所有,我會使用while(wait(NULL)>0)。然而你在這種情況下做什麼?我寫了下面的示例代碼:多叉,等待第一個完成

pid_t *pid; 
int i; 

pid = malloc(sizeof(pid_t)*children); 
for(i=0;i<children;i++) 
{ 
    if((pid[i]=fork())<0) 
    { /* error */ } 

    if(pid[i]==0) 
    { 
      //WriteOnFifos 
      return 0; 
    } 
    else 
    { 
      //wait for the first process to finish 
    } 
} 

在此先感謝。任何幫助,將不勝感激。

+0

它甚至不會編譯。 'fork'不是函數調用 –

+0

哎呀對不起,我會編輯 –

+0

不要只編輯。發佈完整的代碼。 –

回答

0

只需使用wait(NULL)。正如文件所述,它會一直等到其中一個孩子終止。所以它會做你想做的,即:等待第一個孩子完成。

+0

如果第一個進程退出,父進程繼續,並從fifo讀取第一個進程寫入的數據,如果其餘進程尚未完成其作業並且父進程想從中讀取,會發生什麼情況?有沒有辦法讓它等待呢? –

+0

這是一個不同的問題。我不確定我瞭解你的問題。也許你應該閱讀關於該主題的一些基本理論。你可以用'waitpid(pid,NULL,0)'等待一個特定的孩子。 –

+0

「如果其餘的流程沒有完成他們的工作,並且父母想要從他們那裏讀取,會發生什麼?」。這取決於您從FIFO中讀取多少個字節。如果讀取的字節多於孩子寫入的字節數,則通常會阻止「read()」。 –