下面我有一个简单的应用程序代码片段,它接受来自多个客户端的请求并通过 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()
失败时甚至没有创建孩子
我的问题是而不是使用 a sleep()
(它解决了我的问题但使程序运行缓慢!!)或任何IPC
我如何确保叉子先执行我的孩子而不是我的父母
当我想到这一点时,我想到了一些方法,比如使用信号来阻止父级或信号量来实现原子性 有没有简单的方法可以确保我的孩子先执行,然后我的父母开始执行