0

我使用以下调用来生成一个进程,取回其 stdin、stdout 和 stderr 的文件描述符,并观察其 stdout 上的输出:

[widget.pid,widget.stdin,widget.stdout,widget.stderr] = \
            gobject.spawn_async(['/bin/sed','s/hi/by/g'], 
                                standard_input=True,
                                standard_output=True,
                                standard_error=True
                                )
 gobject.io_add_watch(widget.stdout,
                      gobject.IO_IN,
                      getdata)

然后我向widget.stdin 写入行,期望触发回调函数getdata。

我发现只有在我关闭 widget.stdin 时才会调用回调 getdata。

另一方面,从终端,sed 回显发送到标准输入的每个完成的行,所以我希望 sed 每当它在其标准输入上看到一个完成的行并且它一次没有得到这些行时就会生成输出.

我不清楚如何强制写入widget.stdin 的行在/bin/sed 中显示,同时保持连接打开以发送更多行。python -u 标志似乎没有任何区别。有任何想法吗?谢谢。

4

1 回答 1

0

我想我可能问错了问题;我将以不同的标题提交此内容。

我发现只有当孩子的管道填满时,孩子的标准输出上的手表才会在父母中触发;换句话说,在管道填满之前,子进程(“sed”进程)似乎实际上并没有收到任何输入。当我将管道大小设置为 4096 并使用 4096 字节将管道预填充给子进程时,我可以发送 512 字节的块,并且每次发送新块时都会调用我的父进程的 io_add_watch 回调,该回调将读取最多 512 字节给孩子。

于 2013-08-01T02:17:33.963 回答