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

问题描述 投票:0回答:4

我使用无名管道进行父进程和通过 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] );
}

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

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

谢谢你

c linux pipe
4个回答
7
投票

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

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

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


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.

0
投票

那么,您唯一能做的就是关闭管道的两端,对吧? 是的,一旦管道两端的所有句柄都关闭,管道就会被释放。


0
投票

正如史蒂夫上面提到的,我们可能不知道内核的业务 但进一步查看关闭系统调用文档 (close(2)) 我们可以看到:

如果fd是引用底层打开的最后一个文件描述符 文件描述(参见 open(2)),与打开相关的资源 文件描述已释放

https://linux.die.net/man/2/close

© www.soinside.com 2019 - 2024. All rights reserved.