【问题标题】:C get all open file descriptorsC 获取所有打开的文件描述符
【发布时间】:2012-10-27 15:51:23
【问题描述】:

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

【问题讨论】:

  • 在你 exit();return 从 main 之后,内核应该为你关闭这些文件描述符。

标签: c io file-descriptor


【解决方案1】:

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

【讨论】:

  • 显然要容易得多,是的!-) 但是比赛可能仍然是一个问题。
  • 您可能想使用getrlimit(RLMIIT_NOFILE, &rlim) 来找到最大的fd_max
  • 您确定要关闭stdin 的文件描述符。 stdoutstderr (0, 1, 2)?
  • @alk OP 声明“关闭所有打开的文件描述符”,包括那些用于 stdio 流的描述符。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    你可以读出/proc/<pid>/fd.的内容,如果有的话。

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

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

    【讨论】:

    • 您为什么认为/proc 可用?这是关于现存最不便携的噩梦。
    • 你是对的。我修改了我的评论,使其仅适用于某些系统。 @詹斯
    • 如果担心可移植性,您可以阅读/dev/fd/。这比/proc/self/fd 更便携。
    • 在 /proc//fd 目录中列出了文件描述符及其在我的情况下对应的文件,例如“70 -> /file/location/file.blah”。在我看来这真的很方便,因为这样我就可以在我的程序中查明这些文件是在哪里打开而不是关闭。
    【解决方案4】:

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

    我想就是这样……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多