似乎在 mintty 下运行的 msys2 shell 中,至少对于 MINGW64,“stdin”、“stdout”和“stderr”都为“isatty()”报告 0 (false),而如果你打开 Windows CMD.EXE 提示并运行相同的可执行文件,所有三个文件描述符(0、1 和 2)都返回 1(真)。
我不相信这一直是这种行为,因为我很确定在重新安装 msys2 之前我从未遇到过这种情况。
根据 POSIX.1 [IEEE Std 1003.1-2017(IEEE Std 1003.1-2008 修订版)],这不是正确的行为,https: //pubs.opengroup.org/onlinepubs/9699919799/
在程序启动时,应预定义三个流且无需显式打开:标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。打开时,标准错误流没有完全缓冲;当且仅当可以确定流不引用交互式设备时,标准输入和标准输出流才会被完全缓冲。
我的测试表明,在 mintty 中运行 msys2 bash shell 时,stdout 和 stdin 都没有完全缓冲。
将以下内容添加到“main()”的开头确实会使 stderr 和 stdout 无缓冲:
(void)setvbuf(stdout, NULL, _IONBF, 0);
(void)setvbuf(stderr, NULL, _IONBF, 0);