Python 如何获取子流程的打开文件?
如何获取子流程的打开文件 我打开了一个生成文件的子进程,我想得到这些文件的文件描述符,对它们进行fsync 如果我有这样的代码:Python 如何获取子流程的打开文件?,python,linux,posix,fsync,Python,Linux,Posix,Fsync,如何获取子流程的打开文件 我打开了一个生成文件的子进程,我想得到这些文件的文件描述符,对它们进行fsync 如果我有这样的代码: p = subprocess.Popen([ 'some_program' ]) 进程p生成一些文件 我可以使用以下方法获取子流程的流程id: p.pid 但是我如何才能让这些文件的fd调用flush和fsync() 实际上,我发现了一个名为“lsof”(列出打开的文件)的实用程序 但我的系统上没有安装或支持它,所以我没有对它做进一步的调查
p = subprocess.Popen([
'some_program'
])
进程p生成一些文件
我可以使用以下方法获取子流程的流程id:
p.pid
但是我如何才能让这些文件的fd调用flush和fsync()
实际上,我发现了一个名为“lsof”(列出打开的文件)的实用程序
但我的系统上没有安装或支持它,所以我没有对它做进一步的调查,因为我确实需要一种标准的方法
感谢如果您想使用打包解决方案,而不是转到/proc/pid/fd,一个选项是使用lsof如果您想使用打包解决方案,而不是转到/proc/pid/fd,一个选项是使用lsof每个进程都有自己的文件描述符表。如果您知道子进程有一个使用FD 8打开的特定文件(这很简单,只需列出
/proc//FD
),当您执行fsync(8)
时,您正在同步进程的文件,而不是子进程的文件
这同样适用于使用文件描述符的所有函数:fread
、fwrite
、dup
、close
要获得fsync
的效果,可以调用sync
您可以改为实现某种RPC机制。例如,您可以添加一个信号处理程序,使子进程在收到SIGUSR1时在所有打开的FD上运行
fsync
。每个进程都有自己的文件描述符表。如果您知道子进程有一个使用FD 8打开的特定文件(这很简单,只需列出/proc//FD
),当您执行fsync(8)
时,您正在同步进程的文件,而不是子进程的文件
这同样适用于使用文件描述符的所有函数:fread
、fwrite
、dup
、close
要获得fsync
的效果,可以调用sync
您可以改为实现某种RPC机制。例如,您可以添加一个信号处理程序,使子进程在接收到SIGUSR1时在所有打开的FD上运行fsync。此外,您可能需要刷新,而不是fsync。您也不能代表另一个进程刷新。重新考虑您的需求。您不能代表另一个流程进行fsync。此外,您可能需要刷新,而不是fsync。您也不能代表另一个进程刷新。重新考虑您的需求。我认为您可以在procfs中找到这些信息,通常安装在/dev/proc上。除此之外,我不知道。通过查看
/proc/$PID/fd/
,可以获得打开的文件描述符列表。它们是指向原始打开文件的符号链接。我不知道如果你在另一个进程中打开它们,fsync
是否会起作用。你到底想做什么?即使您得到了文件描述符,也肯定不能对它们调用fsync
,因为它们在父进程中没有任何意义。我想您可以在procfs中找到这些信息,通常安装在/dev/proc上。除此之外,我不知道。通过查看/proc/$PID/fd/
,可以获得打开的文件描述符列表。它们是指向原始打开文件的符号链接。我不知道如果你在另一个进程中打开它们,fsync
是否会起作用。你到底想做什么?即使您获得了文件描述符,也肯定不能对它们调用fsync
,因为它们在父进程中没有任何意义。您的意思是从shell运行sync命令吗?它会刷新系统上所有进程的所有文件,在云主机(我运行程序的地方)上可能需要几秒钟的时间。不,我指的是unistd.h中的void sync(void)
C函数。这与sync(1)
程序基本相同。我使用的是python,你知道它的python对应物或者如何从python调用它吗?如果sync
shell命令太慢,那么C函数也是如此。您需要不同的解决方案。是否要从shell运行sync命令?它会刷新系统上所有进程的所有文件,在云主机(我运行程序的地方)上可能需要几秒钟的时间。不,我指的是unistd.h中的void sync(void)
C函数。这与sync(1)
程序基本相同。我使用的是python,你知道它的python对应物或者如何从python调用它吗?如果sync
shell命令太慢,那么C函数也是如此。你需要一个不同的解决方案。