对于以下代码:
#include <unistd.h>
#include <stdio.h>
int main()
{
char buf[6];
printf("%c\n", (char)getc(stdin));
int ret = read(STDIN_FILENO, buf, 5);
printf("%d\n", ret);
printf("%c\n", (char)getc(stdin));
}
当使用“abcdef”作为输入时,系统输出
a
0
b
我认为这意味着在这种情况下 read 无法得到任何东西。然而,当注释掉第一个 getc 调用时,系统输出
5
f
我认为这意味着
read
可以获得一些东西。
我的问题是:如何避免
read
被getc
遮挡?
顺便说一句:您可以从 https://godbolt.org/z/EaPTMWPz9 重新处理该行为
getc
不是 阻塞 任何东西。 getc
是缓冲 输入。它首先将整个字符串读入与 stdin
关联的缓冲区,然后每次调用它时只从缓冲区返回一个字符,直到为空。
read
是一个POSIX函数,不是C语言的标准部分,并且对底层文件描述符进行操作。这是一个不可移植的平台细节。在本例中,它连接到一个管道,该管道中没有任何内容,因为 getc
已经将其清空到 stdin
的内部缓冲区中。
只需使用
fread(..., stdin)
并停止混合抽象层。