非阻塞读取后写入子进程两次

时间:2014-05-15 20:23:28

标签: python popen nonblocking child-process read-write

我有一个从多个子进程读取的python循环(没有阻塞)。有时我必须写那个孩子的过程。 第一次写入,但如果我执行非阻塞读取,则再次写入子进程,第二次写入似乎永远不会通过对孩子的过程。

我相信如果我执行常规阻塞读取(process.stderr.readline()),第二次读取将会通过。有什么帮助吗?

Python循环

# 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 ''

子进程(c程序)

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'
    }
}

输出(python打印...)

  

阅读:先写一下   //别的什么

1 个答案:

答案 0 :(得分:0)

stdin在C中进行行缓冲。您可能需要在子进程中禁用缓冲才能使其正常工作。您还需要添加process.stdin.flush()以确保您不会在作者端进行缓冲。