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

时间:2012-10-17 18:28:05

标签: python linux posix fsync

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

我打开了一个生成文件的子进程,我希望得到这些文件的文件descritor来对它们进行fsync

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

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

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

p.pid

但是如何让这些文件的fd调用flush和fsync()呢?

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

感谢

3 个答案:

答案 0 :(得分:2)

每个进程都有自己的文件描述符表。如果你知道子进程有一个用FD 8打开的某个文件(这很简单,只需要列出/proc/<pid>/fd),当你执行fsync(8)时,你正在同步一个文件<你的过程,而不是孩子的过程。

这同样适用于使用文件描述符的所有函数:freadfwritedupclose ......

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您无法代表其他进程进行fsync。此外,您可能想要刷新,而不是fsync。您也不能代表其他进程刷新。重新考虑你的要求。