下面我有一个简单的应用程序代码片段,它接受来自多个客户端的请求并通过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
我怎样才能确保fork先执行我的孩子而不是我的父母
当我想到这一点时,我想到了一些方法,比如利用信号来阻止父或信号量来实现原子性是否有任何简单的方法可以确保我的孩子先执行然后我的父母开始执行
答案 0 :(得分:1)
waitpid
函数将 BLOCK ,直到指定的进程结束。虽然EINTR
等其他一些原因可能会导致waitpid
返回-1,但通过将waitpid
调用放入循环可以很容易地解决这个问题。例如,如果waitpid
调用返回-1并且errno
== EINTR
,则只需继续循环。有关返回值,请参阅http://linux.die.net/man/3/waitpid。
在创建子进程之前,您的waitpid
调用将从不执行!显然,在waitpid
系统调用之后调用fork
函数,fork
系统调用的返回值不是-1。那么,那时,fork
调用已经返回,这意味着子进程已经存在。