【发布时间】:2012-10-27 15:51:23
【问题描述】:
我想在我的 C 程序中实现行为,以便在发生 SIGINT 时关闭所有打开的文件描述符。有没有一种简单的方法来获取它们的列表?
【问题讨论】:
-
在你
exit();或return从 main 之后,内核应该为你关闭这些文件描述符。
标签: c io file-descriptor
我想在我的 C 程序中实现行为,以便在发生 SIGINT 时关闭所有打开的文件描述符。有没有一种简单的方法来获取它们的列表?
【问题讨论】:
exit(); 或 return 从 main 之后,内核应该为你关闭这些文件描述符。
标签: c io file-descriptor
我会使用蛮力:for (i = 0; i < fd_max; ++i) close (i);。快速且非常便携。
【讨论】:
getrlimit(RLMIIT_NOFILE, &rlim) 来找到最大的fd_max。
stdin 的文件描述符。 stdout 和 stderr (0, 1, 2)?
跟踪所有打开的文件描述符并单独关闭它们。
在一般情况下,您正在使用的库可能有一个打开的文件,关闭它会导致该库出现异常。
事实上,同样的问题也可能存在于你自己的代码中,因为如果你不加选择地关闭文件描述符,但程序的另一部分仍然记得文件描述符并尝试使用它,它会得到一个意外错误或(如果其他文件已打开)操作错误的文件。负责打开文件的组件也负责关闭文件会更好。
【讨论】:
你可以读出/proc/<pid>/fd.的内容,如果有的话。
但请注意潜在的竞争,如果您的应用程序在读取 /proc/<pid>/fd 和您将要关闭所读取的内容之间关闭一些或打开新的应用程序,则可能会发生这种情况。
因此,我想推荐 Kevin Reid 的方法。
【讨论】:
/proc 可用?这是关于现存最不便携的噩梦。
/dev/fd/。这比/proc/self/fd 更便携。
我的 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()] 执行循环。
我想就是这样……
【讨论】: