1

如何获取子进程的打开文件?

我打开了一个生成文件的子进程,我想获取这些文件的文件描述符以对它们进行 fsync

所以如果我有这样的代码:

p = subprocess.Popen([
            'some_program'
])

进程 p 生成一些文件,我可以使用以下方法获取子进程的进程 ID:

p.pid

但是我怎样才能让这些文件的 fd 对它们调用 flush 和 fsync() 呢?

实际上我找到了一个名为“lsof”(列出打开的文件)的实用程序,但我的系统上没有安装或支持它,所以我没有对它做进一步的调查,因为我真的需要一个标准的方法

谢谢

4

3 回答 3

2

每个进程都有自己的文件描述符表。如果您知道子进程使用 FD 8 打开了某个文件(这很容易,只需列出/proc/<pid>/fd),那么当您同步时,fsync(8)正在同步进程的文件,而不是子进程的文件。

这同样适用于所有使用文件描述符的函数:fread, fwrite, dup, close...

要获得 的效果fsync,您可以sync改为调用。

您可以做的是实现某种 RPC 机制。例如,您可以添加一个信号处理程序,使子fsync进程在收到 SIGUSR1 时在所有打开的 FD 上运行。

于 2012-10-17T22:03:30.040 回答
1

如果你想使用打包的解决方案,而不是去 /proc/pid/fd,一个选项是使用psutils的 lsof

于 2012-10-17T19:04:45.510 回答
1

您不能代表另一个进程进行 fsync。此外,您可能想要刷新,而不是 fsync。您也不能代表另一个进程刷新。重新考虑您的要求。

于 2012-10-17T22:29:04.157 回答