6

我想在我的 C 程序中实现行为,以便如果发生 SIGINT,我关闭所有打开的文件描述符。有没有一种简单的方法来获取它们的列表?

4

4 回答 4

4

跟踪所有打开的文件描述符并单独关闭它们。

在一般情况下,您正在使用的库可能有一个打开的文件,关闭它会导致该库行为异常。

事实上,同样的问题可能存在于你自己的代码中,因为如果你不加选择地关闭了文件描述符,但程序的另一部分仍然记得文件描述符并尝试使用它,它会得到一个意外错误或(如果其他文件已经打开以来)对错误的文件进行操作。负责打开文件的组件也负责关闭文件要好得多。

于 2012-10-27T15:55:22.617 回答
4

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

但是请注意潜在的竞争,如果您的应用程序在读取之间关闭一些或打开新的,/proc/<pid>/fd并且您将关闭您读取的内容,则可能会发生这种情况。

因此,我想推荐 Kevin Reid 的方法。

于 2012-10-27T15:56:46.693 回答
4

我会使用蛮力:for (i = 0; i < fd_max; ++i) close (i);. 快速且非常便携。

于 2012-10-27T16:01:06.060 回答
2

我的 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()] 开始循环。

我想就是这样...

于 2012-10-27T16:23:55.497 回答