下面我有一个简单的应用程序代码片段,它接受来自多个客户机的请求,并通过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调用放入循环中很容易解决这个问题。例如,如果waitpidcall返回-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/

10-12 14:11