关闭描述符对管道的影响

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