在 linux 中设置 _IOFBF 时标准输入如何工作

How does stdin work when _IOFBF is set in linux

#当设置_IOFBUF时,我认为应该调用系统调用read并且a 仅在程序退出或缓冲区为 full.But 之前设置 休眠函数前变量a获取输入值#

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) 
{
    char buf[1024];
    int a;

    setvbuf(stdin, buf, _IOFBF, 1024); // set stdin full buf
    printf("input a:\n");
    scanf("%d", &a);
    printf("a: %d\n", a);
    printf("sleep 5(s)\n");
    sleep(5);

    return 0;
}

你猜:

when _IOFBUF is set, I think the system call read should be called and a is set only before the program exits or the buffer is full

您认为至少在没有显式库支持的情况下不适用于 C 的逻辑:您认为延迟执行。后者通常用于某些环境和语言(Javascript-based、Tcl-based 等),但不适用于 C。

在 C 语言中,当使用 scanf 从您的程序请求输入时,系统调用 read 将在此处执行,缓冲区将被填满。然后,该缓冲区用于读取。下一个 read 系统调用将在缓冲区为空时执行,而不是更早;但是初始填充是针对第一个输入请求(您的scanf)以模拟方式完成的。而且,是的,这是在 sleep.

之前

如果输入是(或可以是)终端,为其设置全缓冲显然是错误的(stdio 默认情况下不这样做)。使用全缓冲,scanf 将 return 仅在缓冲区填充后(即许多键盘敲击)and/or 显式 EOF(在 Unix/BSD/Linux 系统中输入后按 Ctrl+D) .我猜这不是你想要的行为。