我想在我的Linux C程序中使用管道和execvp函数模拟bash。
ls -l | wc -l
这是我的程序:
if(pipe(des_p) == -1) {perror("Failed to create pipe");}
if(fork() == 0) { //first fork
close(1); //closing stdout
dup(des_p[1]); //replacing stdout with pipe write
close(des_p[0]); //closing pipe read
close(des_p[1]); //closing pipe write
if(execvp(bash_args[0], bash_args)) // contains ls -l
/* error checking */
}
else {
if(fork() == 0) { //creating 2nd child
close(0); //closing stdin
dup(des_p[0]); //replacing stdin with pipe read
close(des_p[1]); //closing pipe write
close(des_p[0]); //closing pipe read
if(execvp(bash_args[another_place], bash_args)) //contains wc -l
/* error checking */
}
close(des_p[0]);
close(des_p[1]);
wait(0);
wait(0);
}
这段代码实际上可以运行,但是没有达到预期的效果。有什么问题吗?它不起作用,而我不知道为什么。
dup()
或dup2()
将管道的一个端口复制到标准输入或标准输出,则需要关闭原始管道的两个端口。可能存在不需要这样做的情况,但是这种情况极少遇到。 - Jonathan Lefflerexecvp
调用,请仅在父进程中关闭管道的写入端(在子进程中两者都关闭)。如果在父进程中同时关闭两者,则后续对waitpid
的调用将挂起。 - Asad-ullah Khan