c - 两个文件描述符都关闭后,Linux 会自动释放未命名的管道吗?

标签 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] );
}

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

是否有明确说明这一点的文档?

谢谢

最佳答案

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

When all file descriptors associated with a pipe or FIFO special file are closed, any data remaining in the pipe or FIFO will be discarded.

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

关于c - 两个文件描述符都关闭后,Linux 会自动释放未命名的管道吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4392787/

相关文章:

c - 从标准输入读取 C 语言中的 libxml2

c - 如何将图像切片/切割成碎片

linux - BASH - 复制时忽略隐藏文件和空源目录

c - Linux C IPv6 原始套接字 - 告诉套接字不要分配流标签

Linux 内核/proc FIFO/管道

linux - "/dev/bin/load.sh[425]: : cannot open"- Linux 文件重定向到空字符串

c - 为什么在这段代码中没有打印任何换行符时缓冲区被刷新?

c - 使用 netlink API 设置无线信道

c - 关于指针和内存访问的疑问

linux - 计算多个文件中的重复项