如何确保第二个fork在失败,管道和dup2之后不会继续

时间:2017-05-02 02:25:58

标签: c fork

如果exec在第一个子进程中失败,我如何确保不分叉另一个进程并停止我的管道?我必须等待吗?

id_t pid, pid2;
int fd[2];

pipe(fd);
pid = fork();

if(pid==0){
    dup2(fd[WRITE_END], STDOUT_FILENO);
    close(fd[WRITE_END]);
    execlp("grep", "grep", "alpha",NULL);
}else{ 
    pid2=fork();

    if(pid2==0){
        dup2(fd[READ_END], STDIN_FILENO);
        close(fd[READ_END]);
        execlp("grep", "grep", "alpha",NULL);
    } else {
        close(fd[READ_END]);
        close(fd[WRITE_END]);
        wait(NULL);
        wait(NULL);
    }
}

2 个答案:

答案 0 :(得分:0)

你需要一个waitpid()语句,你还需要一个循环(警告:这不是实际运行的代码)

   int pid_status, i;

   for( i = 0; i < 2; i ++ ){

     pid_t  pid = fork();

     if (pid == -1 ) retunr 1;

     if( pid == 0 ){
          --- do you stuff ---
     }

     if(waitpid(pid, &pid_status, 0 ) == -1{
         return 1;
     }
 }

waitpid()将等到当前子进程完成。

答案 1 :(得分:0)

  

我如何确保不分叉另一个进程并停止我的进程   管道,如果exec在第一个子进程中失败?我必须等待吗?

我认为你必须更加关注array('1,'2','3','4')失败时会发生什么,特别是你的代码没有什么特别之处,控件会在exec之后跳转,我怀疑是安全。通常,只需在{:}之后调用if

exit

现在提出您的原始问题:不,exec(...); // if it works, ok... exit(MY_FAILURE_CODE); // in case `exec` fails stops the program gracefully 肯定不适合您的需求,因为它会等到流程结束,您将无法在合适的时间启动其他人。但是你的需求可能不是真正的需求,你为什么要如此关注wait失败呢?如果在一系列管道中出现所有问题都是相同的,那么中间会出现一些错误......通过调用exec,您可以确保管道上没有编写器,这样读者就能够检测管道上的EOF然后在级联中停止等。一切都会好的。