2014-07-10 28 views
0

這裏下面我有應用程序的一個簡單的代碼段,其從多個客戶機需要請求,並通過EXEC調用的數學運算,並等待結果從調用的進程通過管道到這些結果返回各客戶機如何確保我的孩子先執行然後再執行父代?

case '+': 
     fret=fork(); 
     if(fret==-1) 
      perror(" error in forking at add\n"); 
     else if(fret==0) 
     {//child 
      sprintf(s_rp,"%d",p_op[0]); 
      sprintf(s_wp,"%d",p_op[1]); 
      argm[0]="add"; 
     if((ret= execve(argm[0],argm,argp))== -1) 
     { 
      printf("exeve of add failed \n"); 
      exit(1); 
     } 
     } 
     else 
     {//parent 
      write(p_op[1],&request,sizeof(request)); 
      if((ret=waitpid(fret,&x,0))==-1) 
      perror("Error with wait at +\n"); 
      read(p_op[0],&result,sizeof(result)); 
      write(fd_res,&result,sizeof(result)); 

     } 
     break; 

這裏我面臨父母的一個簡單的問題是執行的第一快速度,這使得waitpid()失敗,一般waitpid()等待孩子退出,但我的情況下,孩子甚至沒有創建時父遇到waitpid()失敗

我的問題是使用sleep()(它解決了我的問題,但使程序運行緩慢! )或任何IPC我怎樣才能確保叉執行我的孩子第一次比我的父母

當我想到這一點,一些辦法捲入我的腦海裏,像利用信號阻止父或信號量來實現原子性是有沒有簡單的辦法,確保我的孩子會先執行,然後我的父母開始執行

回答

1
  1. waitpid功能BLOCK,直到指定進程結束。儘管EINTR等其他一些原因會導致waitpid返回-1,但通過將waitpid調用放入循環可以很容易地解決這個問題。例如,如果waitpid呼叫返回-1和errno == EINTR,則只需繼續循環。有關返回值,請參閱http://linux.die.net/man/3/waitpid

  2. 您的waitpid致電將永遠不會在子進程創建之前執行!顯然,waitpid函數在系統調用fork之後調用,系統調用的返回值不是-1。所以,當時,fork調用已經返回,這意味着子進程已經存在。

+0

關注你的第二條語句:但是我的perror在waitpid下報告'控制檯上沒有子進程'爲什麼這麼 – kakeh

+1

你的情況不能再出現在我的Ubuntu 12.04 x86_64機器上。你能修改你的代碼或發佈另一個可以被我編譯和執行的代碼嗎? @Shyam –

相關問題