防止重复使用文件描述符

无论如何,在Linux(或者更一般的POSIX操作系统)中,确保在程序执行过程中,即使文件closures,另一个文件被打开,文件描述符也不会被重用。 我的理解是,这种情况通常会导致closures文件的文件描述符被重新分配给新打开的文件。

我正在做一个I / O跟踪项目,如果我可以假设在open()/ fopen()调用之后,那个文件描述符的所有后续I / O都是同一个文件,那么这会使生活更简单。

我将采取编译时或运行时解决scheme。

如果不可能的话,当我处理跟踪文件(注意所有打开和closures的调用的位置)时,我可以做我自己的会计,但是我希望在执行跟踪的程序期间压缩问题。

请注意, POSIX要求 :

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

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

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

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

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

通过“注入” dup2(X, Y); close(X);来防止FD再次使用似乎是微不足道的dup2(X, Y); close(X); dup2(X, Y); close(X); 调用应用程序,并调整Y是任何你想要的。

但是,应用程序本身可能会使用dup2强制重新使用以前关闭的FD,并且如果您阻止了该功能,则可能无法正常工作,所以我认为您只需在后处理步骤中处理此问题即可。

另外,如果您不允许重复使用,那么编写一个将会耗尽FD的应用程序是相当容易的。