代码之家  ›  专栏  ›  技术社区  ›  Magnus

关闭进程中所有打开的文件

  •  14
  • Magnus  · 技术社区  · 16 年前

    如何查找进程中所有打开的文件(从进程内部)?

    这似乎有助于了解 fork() (之前 exec() ).

    getdtablesize() 更便于携带 sysconf(_SC_OPEN_MAX) ,但尝试关闭 有效的

    4 回复  |  直到 7 年前
        1
  •  8
  •   R.. GitHub STOP HELPING ICE    14 年前

    如果你的程序要调用 fork exec ,您确实应该使用 O_CLOEXEC 标记以便您不必在之前手动关闭它们 执行官 . 你也可以使用 fcntl 在文件打开后添加此标志,但这取决于多线程程序中的竞争条件。

        2
  •  5
  •   Martin v. Löwis    16 年前

    尝试关闭所有文件描述符听起来可能效率不高,但实际上并没有那么糟。如果系统是好的,那么查找文件描述符的系统调用实现应该相当高效。

    如果只想找到关闭打开的文件描述符,可以在存在proc文件系统的系统上使用它。E、 g.在Linux上,/proc/self/fd将列出所有打开的文件描述符。遍历该目录,并关闭所有项>2,不包括表示要遍历的目录的文件描述符。

        3
  •  2
  •   Edward Tomasz Napierala    7 年前

    在支持closefrom(2)系统调用的系统上(基本上是指除Linux以外的任何unix),专门为此目的而设计。

        4
  •  2
  •   AMADANON Inc.    7 年前

    在花了很多时间跟踪一个bug之后,是的,关闭所有文件描述符可能会导致问题。

    问题是,有多少文件描述符?

    1024过去很常见,1024不是一个完全不合理的关闭文件句柄数。因为大多数都是关闭的,所以这只是检查内存中的一个字节。

    我的操作系统默认为1048576。在这个(无可否认的慢)服务器上,尝试关闭文件句柄显然要花费4.7微秒以上的时间。这导致超时(5秒)。也不知道这个数字会有多高。至少要设定一个合理的上限。

    /proc/self/fd并不理想,但是像这样的错误很难找到。