一旦两个文件描述符都关闭,Linux是否会自动释放未命名的管道?

时间:2010-12-08 21:57:23

标签: c linux pipe

我使用一个未命名的管道进行父进程和通过fork()创建的子进程之间的进程间通信。我正在使用unistd.h中包含的pipe()函数

我认为一旦两个文件描述符都被关闭(并且在两个进程中),管道就被释放/释放/销毁/等等。但我没有在手册中找到任何明确说明这一点的内容。我正在制作一个可以运行很长时间的程序,所以我想防止内存泄漏和其他类似的事情。

我的函数体看起来像:

int pipefds[2];

pipe( pipefds );

if ( fork() == 0 ) {

    close( pipefds[1] );
    ...
    //Use pipefds[0]
    close( pipefds[0] );

} else {

    close( pipefds[0] );
    ...
    //Use pipefds[1]
    close( pipefds[1] );
}

可以安全地假设在此函数终止于子节点和父节点之后,管道已被释放/释放/销毁/等。 ?

有没有明确说明这一点的文件?

谢谢

3 个答案:

答案 0 :(得分:6)

http://www.opengroup.org/onlinepubs/009695399/functions/close.html

  

当所有文件描述符关联时   用管道或FIFO特殊文件   关闭,管道中剩余的任何数据   或FIFO将被丢弃。

实际上并没有所有资源都被释放,因为内部内核gubbins不是“数据留在管道中”,但我认为我们可以安全地假设如果你的内核保留了任何内容那,这是你内核的业务,而不是你的业务: - )

答案 1 :(得分:5)

close的文档说明了这一点。

 The close() call deletes a descriptor from the per-process object reference
 table.  If this is the last reference to the underlying object, the
 object will be deactivated.

答案 2 :(得分:0)

嗯,关于你唯一可以做的就是关闭管道的两端,对吗?是的,一旦管道两端的所有把手都关闭,管道将被解除分配。