子进程如何处理文件指针?

How does subprocess handle file pointer?

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

#!/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 语句应该做的吗?要安全获取和释放资源?但是,如果日志文件的句柄在调用后立即释放,那么当主脚本继续运行时,子进程缓冲区如何稍后写入日志?

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

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

有时是否保留 any 个副本很重要:例如,当 every 个副本写入结束时,从管道读取会产生 EOF已关闭。