在这个简单的代码中,我注意到您没有从第二个read调用中读取stdin,为什么会这样?由于这些功能没有缓冲。
#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;
}
答案 0 :(得分:3)
如果您启动程序并键入(例如)
a [enter]
然后在标准输入上等待两个字符:“ 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);
然后它将按预期工作。