在 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) .我猜这不是你想要的行为。
#当设置_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) .我猜这不是你想要的行为。