我有一个从多个子进程读取的python循环(没有阻塞)。有时我必须写那个孩子的过程。 第一次写入,但如果我执行非阻塞读取,则再次写入子进程,第二次写入似乎永远不会通过对孩子的过程。
我相信如果我执行常规阻塞读取(process.stderr.readline()),第二次读取将会通过。有什么帮助吗?
# create mock process
childprocesses = []
p = subprocess.Popen(['./cprogram'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
childprocesses.append(p)
loop_4eva()
# the loop
def loop_4eva():
for process in childprocesses:
if(process.poll() is None):
process.stdin.write("first write\n")
output = non_block_read(process.stderr).strip()
print output
process.stdin.write("second write\n")
output = non_block_read(process.stderr).strip()
print output
def non_block_read(output):
fd = output.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
try:
return output.readline()
except:
return ''
void main(){
char buffer[256];
while(1){
fgets(buffer, 256, stdin);//read/buffer one line from stdin
fprintf(stderr, "read: %s", buffer);//buffer includes '\n'
}
}
阅读:先写一下 //别的什么
答案 0 :(得分:0)
stdin
在C中进行行缓冲。您可能需要在子进程中禁用缓冲才能使其正常工作。您还需要添加process.stdin.flush()
以确保您不会在作者端进行缓冲。