在这个代码示例中,我注意到在写入之前必须关闭管道读取缓冲区的另一端,反之亦然。如果你没有关闭另一端,那为什么会产生什么样的后果或副作用呢?
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;
}
答案 0 :(得分:4)
您必须关闭相反的两端,以便只有一个分叉进程尝试从管道中读取数据。对于对称性,最好关闭管道的输入侧。
这样做的另一个原因是防御性编程。最终,您必须关闭管道,否则您将泄漏文件句柄。如果您不需要它们,请立即关闭它们,以免日后忘记。