C管道标准件至叉子
我正试图编写一个C程序,使用pipe和fork执行C管道标准件至叉子,c,linux,shell,pipe,fork,C,Linux,Shell,Pipe,Fork,我正试图编写一个C程序,使用pipe和fork执行ls | wc,但我不知道我的代码出了什么问题。当我运行下面的代码时,不会返回任何内容 int main() { pid_t p1, p2; int fd1[2]; pipe(fd1); p1 = fork(); if (p1 == 0) { close(STDOUT_FILENO); dup2(fd1[1], STDOUT_FILENO); close(
ls | wc
,但我不知道我的代码出了什么问题。当我运行下面的代码时,不会返回任何内容
int main() {
pid_t p1, p2;
int fd1[2];
pipe(fd1);
p1 = fork();
if (p1 == 0) {
close(STDOUT_FILENO);
dup2(fd1[1], STDOUT_FILENO);
close(fd1[0]);
execlp("ls", "ls", (char *)NULL);
} else {
p2 = fork();
if (p2 == 0) {
dup2(fd1[0], STDIN_FILENO);
close(fd1[0]);
close(fd1[1]);
execlp("wc", "wc", (char *)NULL);
} else {
waitpid(p2, 0, WUNTRACED);
waitpid(p1, 0, WUNTRACED);
}
}
return 0;
}
你没有清楚地解释这个程序在做什么,你认为是错误的。但是,当我自己运行这个程序时(在添加了适当的标题之后——将来,请不要忘记这些标题),它会一直挂起,直到我按下control-C。我假设这是您不想要的,您想要的是它打印
wc
的输出,然后退出
程序挂起,因为在调用wait
时,父进程中的fd1[1]
仍处于打开状态wc
在所有引用管道写入端的文件描述符关闭之前,不会收到EOF指示。但是父进程在其两个子进程退出之前不会关闭管道的写端,而wc
在获得EOF之前不会退出,因此会出现死锁
您需要将
close(fd1[1])
添加到第一个if
的父端,紧靠p2=fork()
之前。这足以打破僵局。您还应该将close(fd1[0])
添加到第二个if
的父端,紧跟在waitpid
调用之前。您还应该检查所有操作是否有错误。您说的“未返回任何内容”是什么意思?旁注:两个叉子后的不对称性有什么原因吗?一旦您关闭了要复制的文件描述符,另一次就不会了。还有为什么不在父进程中关闭管道文件描述符?将0
作为第二个参数int*status
传递到waitpid
的原因是什么?