我使用无名管道进行父进程和通过 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] );
}
可以安全地假设,在该函数在子函数和父函数中终止后,管道已被释放/释放/销毁/等。 ?
有没有明确说明这一点的文档?
谢谢你
http://www.opengroup.org/onlinepubs/009695399/functions/close.html
当所有文件描述符关联时 带有管道或 FIFO 特殊文件的 已关闭,管道中剩余的任何数据 否则 FIFO 将被丢弃。
实际上并不是说所有资源都被释放,因为内部内核gubbins不是“管道中剩余的数据”,但我认为我们可以安全地假设,如果您的内核在那之后保留了任何内容,那是您的内核的事,并且没有你的:-)
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.
那么,您唯一能做的就是关闭管道的两端,对吧? 是的,一旦管道两端的所有句柄都关闭,管道就会被释放。
正如史蒂夫上面提到的,我们可能不知道内核的业务 但进一步查看关闭系统调用文档 (close(2)) 我们可以看到:
如果fd是引用底层打开的最后一个文件描述符 文件描述(参见 open(2)),与打开相关的资源 文件描述已释放;