读取被 getc 阻止

问题描述 投票:0回答:1

对于以下代码:

#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

重新处理该行为
c
1个回答
1
投票

getc
不是 阻塞 任何东西。
getc
缓冲 输入。它首先将整个字符串读入与
stdin
关联的缓冲区,然后每次调用它时只从缓冲区返回一个字符,直到为空。

read
是一个POSIX函数,不是C语言的标准部分,并且对底层文件描述符进行操作。这是一个不可移植的平台细节。在本例中,它连接到一个管道,该管道中没有任何内容,因为
getc
已经将其清空到
stdin
的内部缓冲区中。

只需使用

fread(..., stdin)
并停止混合抽象层。

© www.soinside.com 2019 - 2024. All rights reserved.