关闭描述符对管道的影响
Effect of closing descriptor for pipe
我有这段代码与
ls -l | wc -l.
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);
}
}
该代码工作正常,但是一旦我注释掉关闭 parent 中的 p[1] 的行,它就不起作用,而是被阻止了。
我知道如果没有作者,read() 将不起作用,反之亦然。
但是我不知道在这种情况下可能是什么问题。
wc
在没有更多输入时停止。因此,即使 child 完成了对管道的写入,parent 也会等待来自自身的更多输入,因为它一侧的 p[1]
没有关闭。
因此,通过关闭 p[1]
,parent 进程表达了它不会向自身提供输入的意图。
我还建议使用 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);
}
}
我有这段代码与 ls -l | wc -l.
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);
}
}
该代码工作正常,但是一旦我注释掉关闭 parent 中的 p[1] 的行,它就不起作用,而是被阻止了。 我知道如果没有作者,read() 将不起作用,反之亦然。 但是我不知道在这种情况下可能是什么问题。
wc
在没有更多输入时停止。因此,即使 child 完成了对管道的写入,parent 也会等待来自自身的更多输入,因为它一侧的 p[1]
没有关闭。
因此,通过关闭 p[1]
,parent 进程表达了它不会向自身提供输入的意图。
我还建议使用 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);
}
}