使用子进程访问由子进程创建的文件描述符.Python 2.5 中的 Popen



Python 2.5 是否可以访问子进程打开的文件描述符。Popen() 子进程?不是特定的输入和输出,而是它创建的其他管道?如果是这样,我将如何做到这一点?感谢您的帮助。

没有跨平台的方式来访问另一个进程的文件描述符。

在几乎任何POSIX系统上,你都可以使用sendmsg通过Unix套接字或管道传递打开的文件(通常需要SCM_RIGHTS),Windows具有不同但相似的功能。因此,如果您控制子进程,则可以以这种方式执行操作。这允许您具有相同的实际文件对象和/或其克隆,尽管您仍将具有该对象的不同描述符(少量)或句柄。

某些平台可以使用其描述符或句柄显式访问另一个进程的文件句柄。例如,在 Linux 上,'/proc/{}/fd/{}'.format(childpid, childfd)将是指向打开文件的符号链接(即使它不在文件系统的名称可访问部分中),当然在这种情况下,您最终会为同一文件使用不同的文件对象。Windows 具有 NT 级 API,用于枚举子进程的所有打开句柄;除非孩子明确提供给您,否则您通常无法访问它们,但您可以获取路径名并为自己打开它。(当然,尽管任何接近执行的文件都会被破坏,所以要小心......如果你想使用stdin/out/err管道,它会变得更加复杂。

最后,一些平台有办法在分叉新进程和启动新线程之间做一些事情。例如,使用 linux,您可以使用与fork中相同的所有标志clone,除了设置为 trueCLONE_FILES,然后您将拥有一个单独的进程,但该进程仍然共享文件描述符表。然后,您实际上可以使用相同的文件描述符编号来引用相同的文件对象。这显然不是由subprocess完成的,但是分叉subprocess源代码(或者,更好的是,如果您使用的是 3.1 或更早版本,则subprocess32向后移植)并制作自己的版本来包装它并不难。

如果你想要一个跨平台的解决方案,你可以自己构建一个。例如,在大多数情况下,只需通过管道传递绝对路径名,并让父级打开与子级相同的文件。除非你真的需要共享文件或类似文件的位置,或者使用文件描述符来访问你无权访问的文件作为可传递的功能(在任何一种情况下,你都可能没有编写跨平台代码),这通常也会工作,而且要简单得多。

最新更新