我有这段代码做同样的工作 ls -l | wc -l </ strong>。
main ()
{
int i;
int p[2];
pid_t ret;
pipe (p);
ret = fork ();
if (ret == 0)
{
close (1);
dup (p[1]);
close (p[0]);
execlp ("ls", "ls", "-l", (char *) 0);
}
if (ret > 0)
{
close (0);
dup (p[0]);
close (p[1]);
// wait (NULL);
execlp ("wc", "wc", "-l", (char *) 0);
}
}
代码工作正常但是一旦我在父级中注释关闭p [1]的行,它就不起作用,而是被阻止。 我知道如果没有编写器,read()不起作用,反之亦然。 但我无法弄清楚在这种情况下会出现什么问题。
答案 0 :(得分:3)
wc
停止。因此,即使孩子完成了对管道的写入,父母也会等待自己的更多输入,因为它的p[1]
没有关闭。
因此,通过关闭p[1]
,父进程表达了它不会为自己提供输入的意图。
我还建议使用dup2
:
#include <unistd.h>
int main () {
int p[2];
pid_t ret;
pipe(p);
ret = fork();
if (ret == 0) {
close(p[0]);
dup2(p[1], 1);
execlp ("ls", "ls", "-l", (char *) 0);
}
if (ret > 0) {
close(p[1]);
dup2(p[0], 0);
execlp("wc", "wc", "-l", (char *) 0);
}
}