7

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

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

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

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

4

3 回答 3

9

请注意,POSIX 要求

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

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

也就是说,我认为你最好的选择是使用LD_PRELOAD 技巧来拦截调用close并忽略它们。

于 2012-05-20T00:41:22.080 回答
1

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

于 2012-05-20T00:29:41.920 回答
1

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

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

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

此外,如果您不允许重复使用,编写一个将用完 FD 的应用程序也很容易。

于 2012-05-20T00:34:14.450 回答