0

下面我有一个简单的应用程序代码片段,它接受来自多个客户端的请求并通过 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我如何确保叉子先执行我的孩子而不是我的父母

当我想到这一点时,我想到了一些方法,比如使用信号来阻止父级或信号量来实现原子性 有没有简单的方法可以确保我的孩子先执行,然后我的父母开始执行

4

1 回答 1

1
  1. waitpid函数将阻塞,直到指定的进程结束。尽管其他一些原因EINTR可能导致返回 -1,但通过将调用置于循环waitpid中很容易解决这个问题。waitpid例如,如果waitpidcall 返回 -1 和errno== EINTR,则继续循环。有关返回值,请参见http://linux.die.net/man/3/waitpid 。

  2. 在创建子进程之前,您的waitpid调用将永远不会被执行!很明显,waitpid函数是在syscall之后调用的fork,syscall的返回值fork不是-1。所以,那个时候,fork调用已经返回,这意味着子进程已经存在。

于 2014-07-10T17:00:05.840 回答