我想在我的 C 程序中实现行为,以便如果发生 SIGINT,我关闭所有打开的文件描述符。有没有一种简单的方法来获取它们的列表?
4 回答
跟踪所有打开的文件描述符并单独关闭它们。
在一般情况下,您正在使用的库可能有一个打开的文件,关闭它会导致该库行为异常。
事实上,同样的问题可能存在于你自己的代码中,因为如果你不加选择地关闭了文件描述符,但程序的另一部分仍然记得文件描述符并尝试使用它,它会得到一个意外错误或(如果其他文件已经打开以来)对错误的文件进行操作。负责打开文件的组件也负责关闭文件要好得多。
/proc/<pid>/fd.
如果可用,您可以读出 的内容。
但是请注意潜在的竞争,如果您的应用程序在读取之间关闭一些或打开新的,/proc/<pid>/fd
并且您将关闭您读取的内容,则可能会发生这种情况。
因此,我想推荐 Kevin Reid 的方法。
我会使用蛮力:for (i = 0; i < fd_max; ++i) close (i);
. 快速且非常便携。
我的 POSIX 系统解决方案:
所有打开的 fd 都是可能的最低值。
在open(2)
.
您的新函数打开(并返回)请求的 fd 并将其值传递给名为define_if_is_the_higtest_fd_and_store_it()
.
您应该只有一个int hightest_fd_saved
可访问的单例函数(只有 1 个“描述符表”)命名save_fd()
(初始值为 3(cuzstderr
为 2))。
配置SIGINT
为您的信号功能。在里面,你从 [3, return_fd()
] 开始循环。
我想就是这样...