管道内的execvp()导致整个程序死亡

时间:2015-11-27 20:58:30

标签: c pipeline

我目前正在用C编写一个shell,但我的管道出现问题。

我逐行调用整个函数process(),并使用解析的命令树作为输入。 process()在简单的命令和重定向方面完全正常,所以我知道这不是问题。

在下面,我的cmdList是一个已经解析过的我构建了我的管道,以便子进程将其stdout传递给父函数的stdin。子表示cmdList的左侧树,而父表示右侧。这是我尝试递归调用process()时的样子:

        else if (cmdList->type==PIPE)
        {
            int pipefd[2];
            pid_t fork_result;
            pipe(pipefd);
            fork_result=fork();
            if (fork_result < 0) {
             fprintf(stderr, "Fork failure2\n");
             exit(EXIT_FAILURE);
             }
            if (fork_result==0) {
                int jo3 = close(pipefd[0]);
                int jo1 = dup2(pipefd[1], STDOUT_FILENO);
                process(cmdList->left);
                exit(EXIT_failure);
            }
            else
            {
                close(pipefd[1]);
                int status;
                wait(&status);
                dup2(pipefd[0], STDIN_FILENO);
                process(cmdList->right);             //dies here
                fprintf(stderr,"FAIL\n");
                exit(EXIT_FAILURE);
            }   
        }

这导致我的整个程序死掉,包括调用process()的main函数。如果我用

替换我的recurisve process()调用
execvp(cmdList->left->argv[0],cmdList->left->argv);
execvp(cmdList->right->argv[0],cmdList->right->argv);

然后我的程序永远运行。

我已经尝试过的事情:

  1. 所有dup2&#39; s等待按预期返回,没有错误。
  2. 使用调试器,程序总能到达execvp,一切正常。
  3. 如上所述,process()的其余部分完全适用于与管道无关的所有事情。
  4. 我不确定这是怎么回事。有什么突出的吗?

0 个答案:

没有答案