擅长:python、mysql、java
<p>您可以为子流程创建一个tty对并在其中运行。根据C标准(C99 7.19.3),标准输出只有在它是一个终端时才被缓存(而不是完全缓存,这是你说你不想要的)。(或者显然是名为setvbuf()的子项)。</p>
<p>查看os.openpty()。</p>
<p>未测试代码:</p>
<pre><code>master, slave = os.openpty()
pid = os.fork()
if pid == 0:
os.close(master)
os.dup2(slave, 0)
os.dup2(slave, 1)
os.dup2(slave, 2)
os.execv("/usr/sbin/traceroute", ("traceroute","4.2.2.1"))
# FIXME: log error somewhere
os.exit(1)
os.close(slave)
while True:
d = os.read(master)
if len(d) == 0:
break
print d
os.waitpid(pid, 0)
</code></pre>
<p>请注意,让子进程(在fork()之后)调用setvbuf()将<strong>not</strong>起作用,因为setvbuf()是libc函数,而不是syscall。它只是改变当前进程输出的状态,当加载新的二进制文件时,它将在exec调用中被覆盖。</p>