进行管道传输时,为什么在使用 dup2() 之前必须先 close() 管道的另一端?

Rya*_*yan 4 c pipe

在此代码示例中,我注意到您必须在写入之前关闭管道读取缓冲区的另一端,反之亦然。为什么会这样?如果不关闭对端会产生什么样的后果或副作用?

int main() {
  char b[20];
  int p[2];
  int rc = pipe( p );
  int pid = fork();

  if ( pid > 0 ) {
    close( p[0] );
    rc = dup2( p[1], 1 );
  }

  printf( "0987654321" );
  fflush( NULL );

  if ( pid == 0 ) {
    close( p[1] );
    rc = read( p[0], b, 6 );
    b[rc] = '\0';
    printf( "%d-%s\n", getpid(), b );
  }
  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*ane 7

您必须关闭相对的两端,以便只有一个分叉进程尝试从管道读取数据。为了对称,最好关闭管道的输入侧。

这样做的另一个原因是防御性编程。最终,您必须关闭管道,否则将泄漏文件句柄。如果您不需要它们,请立即关闭它们,以免忘记稍后再执行。

  • 当阅读器关闭其末尾时,您通常还需要“EPIPE”/“SIGPIPE”。如果您仍然拥有正在阅读的 fd 的打开副本,则这种情况永远不会发生。 (3认同)