下面我有一个简单的应用程序代码片段,它接受来自多个客户机的请求,并通过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
我如何确保叉子比我父母先处决我的孩子当我想到这一点时,一些方法在我脑海中盘旋,比如使用信号来阻止父信号或信号量来实现原子性,有没有任何简单的方法可以确保我的孩子先执行,然后我的父开始执行
最佳答案
waitpid
函数将阻塞,直到指定的进程结束。尽管其他一些原因(如EINTR
可能导致waitpid
返回-1),但是将waitpid
调用放入循环中很容易解决这个问题。例如,如果waitpid
call返回-1并且errno
=EINTR
,则继续循环。关于返回值,请参见http://linux.die.net/man/3/waitpid。
在创建子进程之前,您的waitpid
调用将永远不会执行!显然,waitpid
函数是在系统调用之后调用的,fork
系统调用的返回值不是-1。因此,在那时,fork
调用已经返回,这意味着子进程已经存在。
关于linux - 如何确保我的 child 先被执行,然后被 parent 执行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24681915/