grep stdin 和 bc stdin 之间有什么不同吗?

Is there is any different between grep stdin and bc stdin?

tornado 中有一些类似 os.dup2 的代码。它将 raw_input() 内容重定向到子进程。

import os,sys
from tornado.ioloop import IOLoop
from tornado.gen import coroutine
from tornado.process import Subprocess as sp

@coroutine
def run(cmd):
    ioloop = IOLoop().current()
    proc = sp(cmd,shell=True,stdin=sp.STREAM, stdout=sp.STREAM, stderr=sp.STREAM)
    while 1:
        proc.stdin.write(raw_input('input: ')+'\n')
        print 'return: ', (yield proc.stdout.read_bytes(1024,partial=True)).strip()



IOLoop().current().run_sync(lambda :run(sys.argv[1]))

如果我们运行bc命令像python test.py bc,会出现如下:

# python sa.py bc
input: 1+1
return:  2
input:

但是如果我运行和python test.py 'grep abc',永远不会return挂断。

input: abcdefg
return:  
(hanging up)

我猜想 bc 的标准输入和 grep 的标准输入之间有什么区别。谁能告诉我为什么?非常感谢。

这两个命令的标准输入没有区别。区别在于 bc 读取一行输入并立即打印结果。 grep 默认情况下会缓冲输出,因此您不会立即看到输出。

您可以尝试将 --line-buffered 选项传递给 grep,它将立即输出每一行。

您还应该记住,grep 可能不会为每一行输出生成一行输出。这意味着,如果您读取被 grep 过滤掉的行,您的程序将在尝试读取输出时挂起(因为没有任何输出)。