与Linux中的fflush功能相同?

时间:2015-11-30 05:31:58

标签: c linux fflush

Linux手册建议不要使用fflush功能。

因此,我发现while( getchar() != '\n'扮演的角色与fflush(stdin)相同。

e.g。)

我的试用代码:

#include <stdio.h>

void main(void)
{
    char input[100] = {};
    printf("abcd");
    while(1);
}

如果我在Linux(Ubuntu)中执行上面的代码,结果什么都没有。因为\n不在字符串中。所以,我必须通过清空stdout缓冲区来打印它们。

奇怪的现象是,当我使用getc(stdout)getc(stdin)时,打印效果会很好。

#include <stdio.h>

void main(void)
{
    char input[100] = {};
    printf("abcd");
    getc(stdout); // or getc(stdin); both working well.
    while(1);
}

我不知道为什么两者都做得很好。我希望只有getc(stdout)才能正常运行,因为我将stdin视为键盘缓冲区,将stdout视为监视缓冲区。

2 个答案:

答案 0 :(得分:2)

仔细阅读fflush(3)的文档(对于输入流,它只对可搜索文件有记录的效果,而不是 stdin 作为终端时)。 AFAIK,fflush(stdin)是未定义的行为(当 stdin 是终端时),当然不会像 while( getchar() != '\n';您应该在某些输出 fflush句柄或FILE*

上致电NULL

如果您在fflush(NULL);繁忙的等待循环之前添加fflush(stdout);while(1);来电,那么您的第一个示例将按预期工作(实际上,您应该在其中调用sleep(3)循环,至少避免加热你的处理器。)

请注意, stdin 可以(在Linux上)是tty(4),或文件或pipe(7)(例如,使用shell重定向或管道)等等....

终端,即ttys,主要是出于历史原因 - 非常复杂的事情。阅读tty demystified页面。在许多情况下,你有一些 double 缓冲:内核通过它的line discipline缓冲tty,而C standard library正在缓冲 stdin 。见setvbuf(3)。当然tty不是键盘(但它上面有一些抽象)。很可能,在您的Linux桌面上,X11服务器仅 读取物理键盘。

如果您关心来自终端的交互式输入,请考虑使用某些库,例如ncursesreadline

阅读Advanced Linux Programming

第二种情况的行为可以通过以下事实来解释:在从 stdin 读取之前,某些C标准库隐式地刷新 stdout ,但AFAIK不保证这一点,你当然应该在需要时明确地 fflush(特别是出于可读性原因)!

阅读getc(3)的文档,它可能会失败(可能会因stdout而失败)。

答案 1 :(得分:-1)

你可以使用setbuf(stdout,NULL);函数调用获得与fflush(stdin)相同的效果。