我正在开发一个用 C 实现的小型 shell(tsh)(这是一项作业)。作业的一部分属于 PIPING。我必须将一个命令的输出通过管道传输到另一个命令。例如:ls -l | sort
当我运行 shell 时,我在其上执行的每个命令都由它生成的子进程处理。子进程完成后,返回结果。对于管道,我想首先实现一个编码示例来检查它是如何工作的。我写了一个方法,部分有效。问题是当我运行管道命令时,子进程完成后,整个程序随之退出!显然我没有正确处理子进程信号(下面的方法代码)。
我的问题:
编辑:另外,在运行此代码时,我得到了两次结果。不知道为什么它运行两次,那里没有循环。
这是我的代码:
pid_t pipeIt(void){
pid_t pid;
int pipefd[2];
if(pipe(pipefd)){
unix_error("pipe");
return -1;
}
if((pid = fork()) <0){
unix_error("fork");
return -1;
}
if(pid == 0){
close(pipefd[0]);
dup2(pipefd[1],1);
close(pipefd[1]);
if(execl("/bin/ls", "ls", (char *)NULL) < 0){
unix_error("/bin/ls");
return -1;
}// End of if command wasn't successful
}// End of pid == 0
else{
close(pipefd[1]);
dup2(pipefd[0],0);
close(pipefd[0]);
if(execl("/usr/bin/tr", "tr", "e", "f", (char *)NULL) < 0){
unix_error("/usr/bin/tr");
return -1;
}
}
return pid;
}// End of pipeIt
是的,shell 必须分叉才能执行每个子进程。请记住,当您致电其中一位execve()
函数族,它replaces当前进程映像与已执行的进程映像。如果您的 shell 直接执行子进程,则它无法继续处理进一步的命令,因为此后它不再存在(除非作为子进程)。
要修复它,只需fork()
再次在pid == 0
分支,并执行ls
对那个孩子的命令。记得wait()
对于两个(所有)子进程,如果您不想异步执行管道。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)