获取所有打开的文件描述符的C语言方法

7

我希望在我的C程序中实现一种行为,即当发生SIGINT时,关闭所有打开的文件描述符。是否有一种简单的方法可以获取它们的列表?


2
当你从主函数中使用exit();或者return退出时,内核会自动关闭这些文件描述符。 - yeyo
4个回答

6
我会使用暴力方法:for (i = 0; i < fd_max; ++i) close (i);。快速且相当通用。

显然容易得多,是的!-) 但比赛仍可能是一个问题。 - alk
4
дҪ еҸҜиғҪеёҢжңӣдҪҝз”Ёgetrlimit(RLIMIT_NOFILE, &rlim)жқҘжҹҘжүҫжңҖеӨ§зҡ„fd_maxгҖӮ - Dale Hagglund
你确定要关闭 stdinstdoutstderr(0、1、2)的文件描述符吗? - alk
1
@alk 楼主说“关闭所有打开的文件描述符”,这包括标准输入输出流的描述符。 - Jens

5
跟踪所有打开的文件描述符,并分别关闭它们。
通常情况下,你使用的库可能会有一个打开的文件,关闭它会导致该库出现问题。
事实上,你自己的代码中也可能存在同样的问题,因为如果你随意关闭文件描述符,但程序的另一部分仍记得这个文件描述符并尝试使用它,则会得到意外错误,或者(如果自此以后已打开其他文件)操作错误的文件。最好的做法是负责打开文件的组件也要负责关闭它。

4

如果可用,您可以读取/proc/<pid>/fd的内容。

但要注意潜在的竞争,如果您的应用程序在读取/proc/<pid>/fd之后关闭或打开新的应用程序,则可能会发生竞争。

因此,总结一下,我建议采用Kevin Reid的方法。


你为什么假设/proc是可用的?它是存在的最不可移植的噩梦。 - Jens
你是对的。我修改了我的评论,使其仅适用于某些系统。@Jens - alk
1
如果担心可移植性,您可以阅读/dev/fd/。这比/proc/self/fd更具可移植性。 - r.v
在/proc/<pid>/fd目录中,列出了文件描述符及其对应的文件,在我的情况下,例如“70->/file/location/file.blah”。我认为这非常方便,因为我可以在程序中准确地找到这些文件是在哪里被打开而没有被关闭。 - thomas.cloud

2

我针对POSIX系统的解决方案:

所有打开的fd都是可能的最低值。
open(2)之上创建一个包装器函数。
您的新函数打开(并返回)所请求的fd,并将其值传递给一个名为define_if_is_the_higtest_fd_and_store_it()的函数。
您应该有一个int hightest_fd_saved,只能由单例函数(只有1个“描述符表”)save_fd()访问(初始值为3(因为stderr为2))。
SIGINT配置为信号函数。 在其中,您从[3,return_fd()]循环。

我想这就是全部了...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接