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