首页 > 解决方案 > read() 函数是如何工作的?(缓冲区中的未读数据会怎样?)

问题描述

我试图在 while 循环中使用 read() 作为条件从终端读取输入,但代码在循环结束之前不会被执行。

这是我的代码:

#include<unistd.h>
int main(void)
{
    char ch;
    while(read(STDIN_FILENO,&ch,1) == 1 && ch != 'q')
    {
        printf("success");
    }
    return 0;
}

它给了我输出:

t
fgr
vr

q
successsuccesssuccesssuccesssuccesssuccesssuccesssuccesssuccesssuccess

即使我尝试正常读取数据,缓冲区中的未读数据也会像这样结束。

代码:

#include<unistd.h>
int main(void)
{
    char ch;
    read(STDIN_FILENO,&ch,1);
    return 0;
}

终端输出

user1@lap:~/Desktop$ ./program2e3
ted
pradeep@LLP:~/Desktop$ ed

为什么未读数据会变成下一条命令?

标签: clinuxterminalunistd.h

解决方案


因为数据仍在内核的 IO 缓冲区中,而不是您进程中的 STDIO 缓冲区中,所以未读数据将被下一个尝试读取它的进程(即 shell 进程)读取。这是因为打开的句柄是从 shell 进程传递到您的进程的。如果您自己打开 tty 设备,就不会发生这种情况。


推荐阅读