【问题标题】:Preventing reuse of file descriptors防止重复使用文件描述符
【发布时间】:2023-03-22 14:51:01
【问题描述】:

在 Linux 中(或更一般地在 POSIX 操作系统中)是否有保证在程序执行期间不会重用任何文件描述符,即使一个文件关闭并打开另一个文件?我的理解是这种情况通常会导致关闭文件的文件描述符被重新分配给新打开的文件。

我正在做一个 I/O 跟踪项目,如果我可以假设在 open()/fopen() 调用之后,对该文件描述符的所有后续 I/O 都指向同一个文件,这将使生活变得更简单.

我将采用编译时或运行时解决方案。

如果不可能,我可以在处理跟踪文件时自己记帐(注意所有打开和关闭调用的位置),但我更愿意在跟踪程序执行期间解决问题。

【问题讨论】:

  • 我认为你应该采取第二种方法(自己做会计)。将文件描述符分配的行为(由 POSIX 严格指定)更改为不符合标准的行为会以微妙(并且可能是危险的)方式破坏程序。

标签: c linux io posix


【解决方案1】:

注意POSIX requires:

open() 函数应返回指定文件的文件描述符 这是当前未打开的最低文件描述符 过程。

所以从最严格的意义上说,您的请求将更改程序的环境,使其不再符合 POSIX。

也就是说,我认为最好的办法是使用LD_PRELOAD trick 拦截对close 的调用并忽略它们。

【讨论】:

  • 谢谢,很高兴在 POSIX 规范中找到我观察到的行为的确认。
【解决方案2】:

您必须编写一个包含 close(2) 的 SO,在旧 FD 上打开 /dev/null,然后在启动应用程序之前使用 $LD_PRELOAD 将其加载到进程空间中。

【讨论】:

  • 实际上,我已经有一个 __wrap_close() 调用来实现跟踪例程,所以听起来我可以在调用 __real_close( ) 在 FD 上。这会一直有效吗? IE。我是否保证在 open("/dev/null") 调用中取回与 __real_close() 调用关闭时相同的 FD?
  • 没有。这就是为什么您打开一次并使用dup2(2) 复制FD。
  • __wrap_close 无处足以用于跟踪目的。想想syscall(SYS_open, ...)
  • 嗯,__wrap_close 对于我将要跟踪的场景来说已经足够了,它们是并行的 HPC 应用程序,几乎总是使用 MPI-IO 层进行集体 I/O。
  • @mhowison 在这种情况下,您可以简单地做一些事情来防止在您的紧密包装中重复使用,但请参阅我对其他问题的回答。
【解决方案3】:

您必须已经ptrace应用程序才能拦截其文件打开和关闭操作。

通过将dup2(X, Y); close(X); 调用“注入”应用程序并将Y 调整为您想要的任何内容来防止FD 重复使用似乎是微不足道的。

但是,应用程序本身可能正在使用 dup2 来强制重新使用以前关闭的 FD,如果你阻止它可能无法正常工作,所以我认为你只需要在后处理步骤中处理这个问题。

此外,如果您不允许重复使用,编写一个将耗尽 FD 的应用程序非常容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 2011-10-30
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 2015-08-11
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多