我写了一个程序capture它输出stdout消息和stderr消息(即printf(),fprintf(stderr,…)
我希望打印信息显示在终端上,并保存到日志文件中。

  ./capture 2>&1|tee log

但我看到,stdout和stderr消息似乎在日志文件中顺序不对。
输出重定向是否按顺序写入stdout和stderr信息?
如果没有,我该怎么做才能把它们弄好?

最佳答案

输出重定向保持您的write()调用顺序。重定向只会更改为进程保留的内核中的文件描述符结构,将值从fd1下复制到fd2中。
您的问题是*printf()缓冲了一些write()调用的输出批处理。通常,对于stderr不使用缓冲,对于line-buffering不使用缓冲。但当您将其重定向到管道中时,它会切换到stdoutbuffering forblock,从而延迟输出(请参见stdout)。将缓冲模式手动设置为以man stdout开头,或在每次setlinebuf(stdout);后使用fflush(stdout);。或者只使用raw*printf()调用。您可以在write()中阅读此内容。
实际上,在bash中,您还可以使用man setlinebuf进行重定向。查看关于|&man bash

10-07 19:32
查看更多