在子进程中缓冲是一个常见的问题。这里有四种可能的方法。在
首先,也是最简单的,您可以一次从管道中读取一个字节。这就是我所说的“肮脏的黑客攻击”,它会带来性能损失,但很简单,它保证你的read()调用只会阻塞到第一个字节,而不是等待一个永远不会填满的缓冲区。但是,这并不会强制另一个进程刷新其写缓冲区,因此,如果这是问题所在,那么这种方法无论如何也帮不上忙。在
第二,我认为下一个最简单的方法是考虑使用Twisted框架,它有一个使用虚拟终端的工具,或者pty(我认为是伪电传打字机)来与您的子进程对话。但是,这可能会影响应用程序的设计(可能会更好,但无论如何,这可能不会对您有用)。http://twistedmatrix.com/documents/current/core/howto/process.html
如果以上两个选项都不适合您,那么您就只能自己解决棘手的I/O并发问题了。在
第三,尝试使用fcntl()和O\u NONBLOCK将管道(所有管道,fork()之前)设置为非阻塞模式。然后,您可以在尝试读/写之前使用select()来测试读/写就绪情况;但是您仍然必须捕获IOError并测试EAGAIN,因为即使在这种情况下也可能发生这种情况。根据子进程的行为,这可能允许您等到数据真正显示出来后再尝试读入它。在
最后的办法是自己实现PTY逻辑。如果您看到过对termio options、ioctl()调用等的引用,那么这就是您要面对的问题。我以前没有做过,因为这很复杂,我从来没有真正需要这样做。如果这是你的命运,祝你好运。在