首页 > 解决方案 > 我不明白为什么这段代码似乎在缓冲,而我正在使用无缓冲的 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;
 }  

标签: csystem-callsglibc

解决方案


如果您启动程序并键入(例如)

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);

然后它应该按预期工作。


推荐阅读