子进程终止之前,子进程的输出在无缓冲stdout管道上不可用?

时间:2018-12-15 20:25:34

标签: python python-3.x subprocess

我已经使用subprocess.Popen(['myapp'], stdin=PIPE, stdout=PIPE, stderr=PIPE, bufsize=0)创建了一个子进程,该子进程执行一个C程序,该程序使用以下命令写入stdoutputs()

问题在于,尽管子进程以p.stdout.read(1024)开始,但Python程序仍在puts("HelloWorld")中阻塞。仅在子流程终止之后,p.stdout上的输出才可用。我认为bufsize=0意味着管道将变得无缓冲,因此输出将立即在管道上可用。

我已阅读以下问题,该问题指出换行符应导致输出刷新。但是,puts()打印换行符,那么管道是否不被识别为交互式设备?

Difference between puts() and printf() in C while using sleep()

  

这是因为puts还会输出换行符,   可以确定为交互式的设备会导致刷新   默认(用于标准输出)(a)。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是 application 行为。即使 pipe 是未缓冲的,应用程序通常也会缓冲一些信息,这些信息将在实际写入文件(任何类型的文件)一段时间后写入。正如Jon在上面的评论所指出的那样,程序可以使用fflush()之类的系统调用来确保它们实际上已经发布了数据,并且在适用的情况下还可以确保物理I / O操作实际上已经完成。