我写了一个程序capture
它输出stdout消息和stderr消息(即printf(),fprintf(stderr,…)
我希望打印信息显示在终端上,并保存到日志文件中。
./capture 2>&1|tee log
但我看到,stdout和stderr消息似乎在日志文件中顺序不对。
输出重定向是否按顺序写入stdout和stderr信息?
如果没有,我该怎么做才能把它们弄好?
最佳答案
输出重定向保持您的write()
调用顺序。重定向只会更改为进程保留的内核中的文件描述符结构,将值从fd1
下复制到fd2
中。
您的问题是*printf()
缓冲了一些write()
调用的输出批处理。通常,对于stderr
不使用缓冲,对于line-buffering
不使用缓冲。但当您将其重定向到管道中时,它会切换到stdout
buffering forblock
,从而延迟输出(请参见stdout
)。将缓冲模式手动设置为以man stdout
开头,或在每次setlinebuf(stdout);
后使用fflush(stdout);
。或者只使用raw*printf()
调用。您可以在write()
中阅读此内容。
实际上,在bash中,您还可以使用man setlinebuf
进行重定向。查看关于|&
的man bash
。