【问题标题】:How to get open files of a subprocess?如何获取子进程的打开文件?
【发布时间】:2012-10-17 18:28:05
【问题描述】:

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

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

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

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

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

p.pid

但是我怎样才能得到这些文件的 fd 以在它们上调用 flush 和 fsync() 呢?

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

谢谢

【问题讨论】:

  • 我想你可以在procfs中找到这些信息,通常挂载在/dev/proc上。更进一步,我不知道。
  • 您可以通过查看/proc/$PID/fd/ 来获取打开的文件描述符列表。它们是指向原始打开文件的符号链接。我不知道fsync 如果您在另一个进程中打开它们是否会起作用。
  • 你到底想做什么?即使你得到了文件描述符,你当然不能对它们调用fsync,因为它们在父进程中没有任何意义。

标签: python linux posix fsync


【解决方案1】:

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

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

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

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

【讨论】:

  • 您的意思是从 shell 运行同步命令吗?它会刷新系统上所有进程的所有文件,这在云主机(我运行我的程序)上可能需要几秒钟......
  • 不,我的意思是来自unistd.h 的void sync(void) C 函数。这与sync(1) 程序基本相同。
  • 我正在使用python,你知道它的python对应物或如何从python调用它吗?
  • 如果sync shell 命令太慢,C 函数也是如此。您需要不同的解决方案。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 2013-05-07
      • 2011-09-07
      相关资源
      最近更新 更多