我编写了一个程序capture
,它输出了stdout消息以及stderr消息(即printf(),fprintf(stderr,..))
我希望打印信息显示在终端上并保存到日志文件中。
./capture 2>&1|tee log
但是我看到stdout和stderr消息似乎没有在日志文件中按顺序排列。
按顺序输出重定向写stdout和stderr信息? 如果没有,我该怎样做才能使它们按顺序排列?
答案 0 :(得分:0)
输出重定向,因为它保持了write()
次调用的顺序。重定向仅更改为进程保留的内核中的文件描述符结构,将值从fd1
下复制到fd2
。
你的问题是*printf()
缓冲输出批量调用一些write()
。通常,不使用stderr
和line-buffering
stdout
的缓冲。但是当您将其重定向到管道时,它会切换到block
缓存stdout
,从而延迟输出(请参阅man stdout
)。将缓冲模式设置为在开始时使用setlinebuf(stdout);
手动排队,或在每fflush(stdout);
后使用*printf()
。或者只使用原始write()
来电。您可以在man setlinebuf
。
实际上你可以在bash中使用|&
进行重定向。查看关于man bash
的{{1}}。