为了账号安全,请及时绑定邮箱和手机立即绑定

管道到三通时强制线缓冲标准输出

管道到三通时强制线缓冲标准输出

慕侠2389804 2019-08-31 14:43:36
通常,stdout是行缓冲的。换句话说,只要您的printf参数以换行符结尾,您就可以立即打印该行。使用管道重定向时,这似乎不成立tee。我有一个C ++程序,a它输出字符串,总是被\n终止stdout。当它由它自己运行时(./a),所有内容都在正确的时间正确打印,正如预期的那样。但是,如果我将它传递给tee(./a | tee output.txt),它会在它退出之前不会打印任何内容,这会使使用的目的失效tee。我知道我可以通过fflush(stdout)在C ++程序中的每次打印操作之后添加一个来修复它。但是有更清洁,更简单的方法吗?例如,是否有一个命令可以运行stdout,即使使用管道也会强行进行行缓冲?
查看完整描述

3 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

尝试unbuffer哪个是expect包的一部分。您可能已经在系统上拥有它。


在你的情况下你会像这样使用它:


./a | unbuffer -p tee output.txt


(-p用于管道模式,其中unbuffer从stdin读取并将其传递给其余参数中的命令)


查看完整回答
反对 回复 2019-08-31
?
MYYA

TA贡献1868条经验 获得超4个赞

你可以试试 stdbuf


$ stdbuf -o 0 ./a | tee output.txt

(大)手册页的一部分:


  -i, --input=MODE   adjust standard input stream buffering

  -o, --output=MODE  adjust standard output stream buffering

  -e, --error=MODE   adjust standard error stream buffering


If MODE is 'L' the corresponding stream will be line buffered.

This option is invalid with standard input.


If MODE is '0' the corresponding stream will be unbuffered.


Otherwise MODE is a number which may be followed by one of the following:

KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.

In this case the corresponding stream will be fully buffered with the buffer

size set to MODE bytes.

但要记住这一点:


NOTE: If COMMAND adjusts the buffering of its standard streams ('tee' does

for e.g.) then that will override corresponding settings changed by 'stdbuf'.

Also some filters (like 'dd' and 'cat' etc.) dont use streams for I/O,

and are thus unaffected by 'stdbuf' settings.

你没在运行stdbuf上tee,你运行它a,所以这应该不会影响你,除非你设置的缓冲a的溪流a的源头“。


另外,stdbuf是不是 POSIX,但GNU-的coreutils的一部分。


查看完整回答
反对 回复 2019-08-31
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

您也可以尝试使用命令在伪终端中执行script命令(这应该强制执行到管道的行缓冲输出)!


script -q /dev/null ./a | tee output.txt     # Mac OS X, FreeBSD

script -c "./a" /dev/null | tee output.txt   # Linux

请注意,该script命令不会传播回包装命令的退出状态。


查看完整回答
反对 回复 2019-08-31
  • 3 回答
  • 0 关注
  • 518 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信