问题可能是缓冲:默认情况下,Cstdio缓冲所有写入stdout的内容,并且仅在写入换行符时才将缓冲区刷新回管道(行缓冲)。fflush(stdout)
写入后致电时问题消失。您还可以通过中setvbuf
定义的功能来禁用(或控制)缓冲<stdio.h>
,例如,用于setvbuf(stdout,NULL, _IONBF, 0)
完全禁用缓冲。
我已经使用以下两个程序测试了第一个变体:
import subprocess
proc = subprocess.Popen("./echotest",
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
proc.stdin.write('abc')
message = proc.stdout.read(3)
print "return message ->" + message + " written by python \n"
proc.stdin.write('q')
proc.wait()
和一些C程序:
#include <stdio.h>
int main (int argc, char **argv) {
for (;;) {
char buf;
fread(&buf, 1, 1, stdin);
if ('q' == buf)
break;
fwrite(&buf, 1, 1, stdout);
fflush(stdout);
}
return 0;
}