我不明白为什么这段代码似乎是缓冲的,而我正在使用无缓冲的 I/O
I don't understand why this code seems to be buffering and I'm using unbuffered I / O
在这个简单的代码中,我注意到您没有从第二次读取调用中读取标准输入,为什么会这样?由于这些函数没有缓冲。
#include <stdio.h>
#include <unistd.h>
int main(void) {
char a, b;
write(1, "first: ", 8);
read(0, &a, 1);
write(1, "second: ", 10);
read(0, &b, 1);
putchar(a);
putchar(b);
return 0;
}
如果您启动程序并输入(例如)
a [enter]
然后两个字符在 stdin 上待定:'a' 和 '\n'(换行符)
所以第一次调用 read()
阻塞,等待输入,并且 - 在您输入字符后 - 读入 a
.
对 read()
的第二次调用 不会 阻塞,但会立即读取第二个未决字符(换行符 \n
)。
要解决此问题,您必须将换行符读入某个虚拟缓冲区,可能像这样:
char a, b, dummy;
write(1, "first: ", 8);
read(0, &a, 1);
read(0, &dummy, 1);
write(1, "second: ", 10);
read(0, &b, 1);
read(0, &dummy, 1);
putchar(a);
putchar(b);
然后它应该按预期工作。
在这个简单的代码中,我注意到您没有从第二次读取调用中读取标准输入,为什么会这样?由于这些函数没有缓冲。
#include <stdio.h>
#include <unistd.h>
int main(void) {
char a, b;
write(1, "first: ", 8);
read(0, &a, 1);
write(1, "second: ", 10);
read(0, &b, 1);
putchar(a);
putchar(b);
return 0;
}
如果您启动程序并输入(例如)
a [enter]
然后两个字符在 stdin 上待定:'a' 和 '\n'(换行符)
所以第一次调用 read()
阻塞,等待输入,并且 - 在您输入字符后 - 读入 a
.
对 read()
的第二次调用 不会 阻塞,但会立即读取第二个未决字符(换行符 \n
)。
要解决此问题,您必须将换行符读入某个虚拟缓冲区,可能像这样:
char a, b, dummy;
write(1, "first: ", 8);
read(0, &a, 1);
read(0, &dummy, 1);
write(1, "second: ", 10);
read(0, &b, 1);
read(0, &dummy, 1);
putchar(a);
putchar(b);
然后它应该按预期工作。