c - 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
为什么未读数据会变成下一条命令?
解决方案
因为数据仍在内核的 IO 缓冲区中,而不是您进程中的 STDIO 缓冲区中,所以未读数据将被下一个尝试读取它的进程(即 shell 进程)读取。这是因为打开的句柄是从 shell 进程传递到您的进程的。如果您自己打开 tty 设备,就不会发生这种情况。
推荐阅读
- ios - 在 Swift 中为 tableView 进行分页时,ScrollView 被击中
- python - 值错误:DataFrame 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
- python - AttributeError:“str”对象在通过用户输入动态传递数据框名称时没有属性“columns”
- amazon-cloudfront - 使用 AWS Lambda@Edge 设置带有用户位置的浏览器 cookie
- charts - 基于类型的 Splunk 图表数据
- javascript - Firestore - 多次创建实例是一个不错的选择吗?
- firebase - Firebase ml vision:平台异常没有捆绑模型
- c++ - 非成员运算符重载的 SFINAE
- kubernetes - Kubernetes 网络策略拒绝所有策略不阻止基本通信
- macros - 两个互相“完成”的宏