gpt4 book ai didi

c - Linux 标准输入缓冲

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:54 26 4
gpt4 key购买 nike

通过以下程序和示例运行,我希望看到“stdin 包含 9 个字节”,但正如您在示例运行中看到的那样,我得到的是“stdin 包含 0 个字节”。这是为什么?我该如何修复此程序以获取标准输入中未读字节的实际数量?

程序:

#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>

void main() {
if ( (setvbuf(stdin, NULL, _IONBF, 0) |
setvbuf(stdout, NULL, _IONBF, 0)) != 0) {

printf("setting stdin/stdout to unbuffered failed");
return;
}

printf("type some keys\n");
sleep(3);
printf("\n");

unsigned long bytesUnread=0;
if (ioctl(0, FIONREAD, &bytesUnread) != 0) {
printf("ioctl error");
return;
}
printf("stdin contains %ld bytes\n", bytesUnread);
}

样本运行:

$ ./a.out          
type some keys
some keys
stdin contains 0 bytes

这是我按回车键运行的另一个示例,您可以看到它按预期运行。

$ ./a.out                 
type some keys
asd

stdin contains 4 bytes

最佳答案

从文件重定向 stdin 或按几个键后按回车键,您将看到您的代码按预期工作,与您是否调用 setvbuf 无关,因为您的问题不是 FILE 正在缓冲的流。 FILE 流甚至不涉及您的 ioctl。相反,您的问题是字节尚未传输。它们位于规范模式 tty 的内核行编辑缓冲区中,允许您在发送它们之前退格、CtrlW 等。

如果您希望 tty 层传输在终端上生成的字节,而不是仅在行编辑后聚合,您需要使 tty 脱离规范模式。 termios.h 接口(interface)是您执行此操作的方式(请参阅 man 3 termios)。通常最简单的方法是 tcgetattrcfmakeraw,然后是 tcsetattr,但是 cfmakeraw 不是完全可移植的,所以它可以最好自己做同样的改变。

关于c - Linux 标准输入缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57916475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com