gpt4 book ai didi

linux - 输出重定向是否按顺序写入 stdout 和 stderr 信息?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:55 26 4
gpt4 key购买 nike

我写了一个程序 capture 输出 stdout 消息和 stderr 消息(即 printf(), fprintf(stderr,..))

我希望打印信息显示在终端上并保存到日志文件中。

  ./capture 2>&1|tee log

但我看到日志文件中的 stdout 和 stderr 消息似乎顺序不对。

输出重定向是否按顺序写入 stdout 和 stderr 信息?如果没有,我该怎么做才能使它们井井有条?

最佳答案

输出重定向保留了 write() 调用的顺序。重定向仅更改内核中为进程保留的文件描述符结构,将 fd1 下的值复制到 fd2 中。

您的问题是 *printf() 缓冲输出批处理一些 write() 调用。通常不使用 stderr 的缓冲和 stdoutline-buffering。但是当您将它重定向到管道时,它会切换到 block 缓冲 stdout,延迟输出(参见 man stdout)。在开头使用setlinebuf(stdout); 将缓冲模式设置为手动行,或者在每个*printf() 之后使用fflush(stdout); >。或者只使用原始 write() 调用。您可以在 man setlinebuf 中阅读相关内容。

实际上,在 bash 中,您也可以使用 |& 进行重定向。查看关于管道man bash

关于linux - 输出重定向是否按顺序写入 stdout 和 stderr 信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33134145/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com