這裏下面我有應用程序的一個簡單的代碼段,其從多個客戶機需要請求,並通過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
我怎樣才能確保叉執行我的孩子第一次比我的父母
當我想到這一點,一些辦法捲入我的腦海裏,像利用信號阻止父或信號量來實現原子性是有沒有簡單的辦法,確保我的孩子會先執行,然後我的父母開始執行
關注你的第二條語句:但是我的perror在waitpid下報告'控制檯上沒有子進程'爲什麼這麼 – kakeh
你的情況不能再出現在我的Ubuntu 12.04 x86_64機器上。你能修改你的代碼或發佈另一個可以被我編譯和執行的代碼嗎? @Shyam –