首页 > 解决方案 > 子进程如何处理文件指针?

问题描述

假设 Python 中的代码框架如下所示。此代码正在调用另一个可执行的 bash 脚本以在 Ubuntu 18.04 上并行运行。

#!/usr/bin/env python3
#encoding:utf-8

import subprocess 
with open(file='subprocess_output.log', mode='a') as file_pointer:
    subprocess.Popen(args=['./subprocess.bash'], stdout=file_pointer, stderr=file_pointer)

#Next section

这是工作。但我很好奇,with一旦主代码进入下一部分,语句是否正在关闭文件指针并释放资源。这不正是with声明应该做的吗?安全地获取和释放资源?但是,如果日志文件的句柄在调用后立即释放,那么当主脚本继续前进时,子进程缓冲区如何稍后写入日志?

对于任何深入了解操作系统如何在较低级别处理文件的人来说,答案可能是显而易见的。因此,任何指向在线资源(双关语)的指针都会很棒。

标签: pythonsubprocessio-redirectionfilehandle

解决方案


每个进程都有自己的一组打开文件。子进程是使用其父进程的打开文件句柄(Unix 中的“描述符”,子进程由flag控制的子集)的副本(子集)创建的。立即关闭父母的句柄,但这根本不会影响孩子。FD_CLOEXECwith

有时是否保留任何副本很重要:例如,当写入端的每个副本都已关闭时,从管道读取会产生 EOF。


推荐阅读