无论如何在Linux(或更常见的POSIX操作系统)中保证在程序执行期间,即使文件被关闭而另一个文件被打开,也不会重复使用文件描述符?我的理解是,这种情况通常会导致已关闭文件的文件描述符被重新分配给新打开的文件。
我正在开发一个I / O跟踪项目,如果我可以假设在open()/ fopen()调用后,该文件描述符的所有后续I / O都是同一个文件,它会让生活更简单
我将采用编译时或运行时解决方案。
如果不可能,我可以在处理跟踪文件时自己进行记帐(注意所有打开和关闭调用的位置),但我更倾向于在执行跟踪程序时压缩问题。 / p>
答案 0 :(得分:7)
请注意POSIX requires:
open ()函数应返回指定文件的文件描述符 这是目前尚未打开的最低文件描述符 过程
因此,从最严格的意义上讲,您的请求会将程序的环境更改为不再符合POSIX标准。
那就是说,我认为最好的办法是使用LD_PRELOAD trick拦截对close
的来电并忽略它们。
答案 1 :(得分:1)
您必须编写一个包含close(2)
的SO,在旧FD上打开/dev/null
,然后在启动应用程序之前使用$LD_PRELOAD
将其加载到进程空间。< / p>
答案 2 :(得分:1)
您必须已ptrace
申请截取其文件开启和关闭操作。
通过向应用程序“注入”dup2(X, Y); close(X);
次调用并将Y
调整为您想要的任何内容来阻止FD重复使用似乎微不足道。
然而,应用程序本身可能正在使用dup2
强制重新使用以前关闭的FD,如果你阻止它可能无法工作,所以我认为你只会必须在后处理步骤中处理这个问题。
此外,如果您不允许重复使用,编写一个将耗尽FD的应用程序非常容易。