为什么通过stdout清除终端后,没有出现stderr输出?

问题描述 投票:0回答:1

我想在清除终端后打印错误,但是错误没有出现:

#include <stdio.h>

int main (int argc, char **argv) {
    
    printf("\033[2J\033[1;1H");
    fprintf(stderr, "error !\n");
    return 0;
}

它与

stdout
完美配合,如果我首先在
stdout
中打印一些内容,然后在
stderr
中打印,它就可以工作。

我尝试过使用

 printf("\033[2J\033[1;1H");
来清除终端,这是同样的问题。

有办法做到这一点吗?

c
1个回答
21
投票

您正在遭受缓冲之苦。

默认情况下,

  • stdout
    如果连接到终端,则为行缓冲。
  • stdout
    否则是块缓冲的。
  • stderr
    未缓冲。
  • 其他句柄是块缓冲的。

(这不是 C 强制要求的,但建议这样做,并且这是您从主要操作系统上的主要编译器获得的。)

一些定义:

  • 块缓冲:当缓冲区已满以及句柄关闭时,输出将发送到操作系统。
  • 行缓冲:当缓冲区已满、写入换行符以及关闭句柄时,输出将发送到操作系统。
  • 未缓冲:输出立即发送到操作系统。

由于您没有填充

stdout
的缓冲区,并且由于打印内容中缺少换行符,因此
printf
不会向操作系统输出任何内容。仅当程序退出时关闭句柄时,控制序列才会输出到操作系统,您将消息打印到
stderr

在打印到

stdout
之前刷新
stderr
的缓冲区将解决该问题。

printf("\033[2J\033[1;1H");
fflush(stdout);  // Send everything that's in the buffer to the OS *now*.
fprintf(stderr, "error !\n");
© www.soinside.com 2019 - 2024. All rights reserved.