即使关闭缓冲,getchar 也不会 return

getchar does not return even though buffering is turned off

我在 Linux 3.12、GCC 4.8 的控制台中编译并运行这个简单的程序:

#include <stdio.h>
main() {
        setvbuf(stdin, NULL, _IONBF, 0);
        printf("%c\n", getchar());
}

运行程序并按任意字母,程序不会退出,除非我按回车键。

是什么阻止了 getchar() 的运行?某处是否有隐藏缓冲区?

问题是您的终端正在缓冲输入。在您的终端发送通过它接收到的输入之前,您的程序无法看到它——默认情况下,它在看到换行符之前不会通过它。

如果您在 Linux 上 运行 bash,运行 stty -icanon 应该更改您的终端设置以直接传递所有输入而不需要换行符.

终端正在执行缓冲。在您按下回车键之前,终端实际上​​不会将该行写入前台程序的标准输入。

要查看程序执行您期望的操作,您只需 运行 echo 'a' | ./myprog。它将立即退出并打印单个字符。