我目前正在用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);
然后我的程序永远运行。
我已经尝试过的事情:
我不确定这是怎么回事。有什么突出的吗?