我正在使用popen3
运行进程,并尝试读取stdout流。我希望能够在stdout中检测到每个角色,但即使使用stdout.getc
,我只能在有换行符时获得任何输出。
任何提示?我已经看到这回答stdin.getc
,但不是stdout。
答案 0 :(得分:2)
您遇到的问题是,大多数程序在通过管道运行时({1}}会发生这种情况)将使用缓冲输出运行。
但你要找的是无缓冲输出。只有当proccess附加到PTY时才会发生无缓冲输出。即如地狱。
当您将进程附加到管道时,输出将被缓冲,除非进程在其输出处理期间显式调用popen
。
您有几个选择:
如果您可以控制使用flush
运行的源代码,则在每个输出序列后强制对stdout进行popen
调用。
您可以尝试在flush
下运行命令,该命令会尝试强制无缓冲输出。
看到这个答案:
Force line-buffering of stdout when piping to tee。
但是,这并不能保证适用于所有程序。
您可以尝试使用Ruby stdbuf -o0
库而不是PTY
来使程序在伪终端下运行,因此运行无缓冲。看到这个答案:
Continuously read from STDOUT of external process in Ruby
选项3最有可能适用于您要运行和监控的任何程序,而其他选项可能会或可能不会起作用,具体取决于您运行的程序以及您是否可以访问该程序的源代码。 / p>