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

C++ 如何通过编程方式查找进程的所有文件句柄?,c++,c,linux,file,C++,C,Linux,File,我有一个进程“x”,它使用“system”C函数来启动ntpd守护进程。我观察到ntpd被传递给打开的文件描述符“x”。即使原始文件被删除,ntpd仍保留文件描述符。例如,“x”使用的一些日志文件在一段时间后会被转出,但“ntpd”为这些删除的文件打开了文件句柄。会不会有什么问题 或者,在调用“system”函数之前,我考虑为所有文件描述符设置“FD_CLOEXEC”标志。但是,由于我们是作为第三个进程“x”的扩展库运行的(“x”根据某些条件加载我们的库),因此不容易了解进程已打开的所有文件描述

我有一个进程“x”,它使用“system”C函数来启动ntpd守护进程。我观察到ntpd被传递给打开的文件描述符“x”。即使原始文件被删除,ntpd仍保留文件描述符。例如,“x”使用的一些日志文件在一段时间后会被转出,但“ntpd”为这些删除的文件打开了文件句柄。会不会有什么问题

或者,在调用“system”函数之前,我考虑为所有文件描述符设置“FD_CLOEXEC”标志。但是,由于我们是作为第三个进程“x”的扩展库运行的(“x”根据某些条件加载我们的库),因此不容易了解进程已打开的所有文件描述符。一种方法是读取/proc//fd并为每个文件句柄设置“fd_CLOEXEC”,并在“system”函数返回后将其重置。我使用的是Linux2.6.16。有没有其他简单的方法可以找到所有的文件处理程序


谢谢,

是的,这会引起问题。在最后一个打开的文件描述符实际上关闭之前,删除的文件所使用的磁盘空间将不会释放以供重用


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

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


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

谢谢Jonathan,理想情况下,我希望fork()中有一个额外的参数“inheritHandle”,以便在创建进程时轻松决定传递文件句柄。windows中的“CreateProcess”有这样的参数。我不知道为什么在Linux中没有人想到这一点?@kumar:困难在于控制哪些文件描述符对保持打开至关重要——例如,stdin、stdout、stderr通常是经过仔细设置的,应该保持打开状态——以及哪些应该关闭。在某些系统中,在“exec()”调用中保持某些描述符的打开是至关重要的——Purify和X11就是两个例子。因此,困难在于“如何指定应该关闭哪些文件描述符”。话虽如此,想出一个方案并不难。
select()
poll()
系统调用(以不同的方式)处理描述符列表。@Jonathan:你能解释一下,在X11的情况下,需要保持fds打开accros
exec()
调用吗?我知道这通常是不必要的,甚至是有害的。顺便说一句,你归类为“暴力”的方法通常被linux应用程序使用。@jpalecek:我知道-我见过在32K-1以下的文件描述符上使用这种方法(在理论上可以打开这么多文件描述符的软件中)!这并不意味着“快”。谢谢Jonathan,理想情况下,我希望在fork()中有一个额外的参数“inheritHandle”,以便在创建进程时很容易决定传递文件句柄。windows中的“CreateProcess”有这样的参数。我不知道为什么在Linux中没有人想到这一点?@kumar:困难在于控制哪些文件描述符对保持打开至关重要——例如,stdin、stdout、stderr通常是经过仔细设置的,应该保持打开状态——以及哪些应该关闭。在某些系统中,在“exec()”调用中保持某些描述符的打开是至关重要的——Purify和X11就是两个例子。因此,困难在于“如何指定应该关闭哪些文件描述符”。话虽如此,想出一个方案并不难。
select()
poll()
系统调用(以不同的方式)处理描述符列表。@Jonathan:你能解释一下,在X11的情况下,需要保持fds打开accros
exec()
调用吗?我知道这通常是不必要的,甚至是有害的。顺便说一句,你归类为“暴力”的方法通常被linux应用程序使用。@jpalecek:我知道-我见过在32K-1以下的文件描述符上使用这种方法(在理论上可以打开这么多文件描述符的软件中)!这并不意味着“快”。请参见