如何通过编程方式查找进程的所有文件句柄?

时间:2010-03-20 04:42:19

标签: c++ c linux file

我有一个进程“x”,它使用“system”C函数来启动ntpd守护进程。我观察到ntpd传递了“x”的打开文件描述符。即使删除了原始文件,ntpd也会保留文件描述符。例如:“x”使用的某些日志文件会在某段时间后被撤销,但“ntpd”会为这些已删除的文件打开文件句柄。它会引起任何问题吗?

或者我想在调用“system”函数之前为所有文件描述符设置“FD_CLOEXEC”标志。但是当我们作为扩展库运行到第三个进程“x”(“x”基于某些条件加载我们的库)时,没有简单的方法来了解进程已打开的所有文件描述符。一种方法是读取/ proc // fd并为每个文件句柄设置“FD_CLOEXEC”,并在“system”函数返回后重置它。我正在使用Linux 2.6.16。有没有其他简单的方法来查找所有文件处理程序?

谢谢,

1 个答案:

答案 0 :(得分:3)

是的,这会导致问题。在最后打开的文件描述符实际上已关闭之前,已删除文件使用的磁盘空间不会被释放以供重用。

理想情况下,您应确保在所有文件描述符上设置FD_CLOEXEC;使用POSIX 2008,您甚至可以在使用O_CLOEXEC标志打开文件时执行此操作。但是如果你是另一个进程的一部分并且不负责其代码,那么这一点都不容易。你的选择是蛮力和无知。您可以遍历您认为可能打开的所有描述符并关闭它们 - 忽略已经关闭的描述符中的错误。那是蛮力。或者你可以忽略打开的文件,并希望系统不会卡得太严重。也许您可以通过检查一次可以打开多少文件来限制搜索。