我使用一个未命名的管道进行父进程和通过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] );
}
可以安全地假设在此函数终止于子节点和父节点之后,管道已被释放/释放/销毁/等。 ?
有没有明确说明这一点的文件?
谢谢
答案 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)
嗯,关于你唯一可以做的就是关闭管道的两端,对吗?是的,一旦管道两端的所有把手都关闭,管道将被解除分配。