在这个简单的代码中,我注意到您没有从第二次读取调用中读取 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;
}
如果您启动程序并键入(例如(
a [enter]
然后有两个字符在标准定值上挂起:"a"和""(换行符(
因此,第一次调用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);
然后它应该按预期工作。