关闭描述符对管道的影响

时间:2015-02-15 18:10:35

标签: pipe posix file-descriptor

我有这段代码做同样的工作 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()不起作用,反之亦然。 但我无法弄清楚在这种情况下会出现什么问题。

1 个答案:

答案 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);
  }
}