gpt4 book ai didi

c - 如果未设置规范模式,非阻塞读取会失败吗?

转载 作者:太空狗 更新时间:2023-10-29 15:40:59 28 4
gpt4 key购买 nike

下面的代码是非阻塞读取终端 IO 的示例,但是当我在控制台上键入一个字符时,它不会立即打印出来。也许你会说我应该先设置 stty -icanon,这样规范模式就被禁用了,这确实有效,但我认为即使我没有禁用 stty icanon,也是非阻塞的终端读取是character-orientedcannonical模式只是唤醒阻塞进程,但我的进程没有阻塞,如果我们输入一个字符,那么fd是可读的,所以它应该立即打印出这个字符。

#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

#define MSG_TRY "try again\n"

int main(void)
{
char buf[10];
int fd, n;
fd = open("/dev/tty", O_RDONLY|O_NONBLOCK);
if(fd<0) {
perror("open /dev/tty");
exit(1);
}
tryagain:
n = read(fd, buf, 10);
if (n < 0) {
if (errno == EAGAIN) {
sleep(1);
write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));
goto tryagain;
}
perror("read /dev/tty");
exit(1);
}
write(STDOUT_FILENO, buf, n);
close(fd);
return 0;
}

最佳答案

O 据我了解,在打开时使用 O_NONBLOCK 标志,只是告诉打开不要等待调制解调器准备就绪,例如,如果您尝试打开终端。

发现此资源非常有用。 http://en.wikibooks.org/wiki/Serial_Programming/termios#Opening.2FClosing_a_Serial_Device

我今天在用 tty(RS232 端口)设备做一些工作。 http://www.gnu.org/software/libc/manual/html_node/Terminal-Modes.html#Terminal-Modes

您如何知道终端是规范的还是原始的?如果我理解正确的话,你说你已经设置了终端非规范(原始)但它后来又变回来了。这样对吗?在那种情况下,您在代码中的哪个位置将设备设置为非规范?

如果你想要原始模式,有一个叫做 cfmakeraw() 的函数。并且不要忘记使用 tcsetattr() 设置您的属性。例如const struct termios 你的termios yourtermios.c_cc[VTIME]=0; yourtermios.c_cc[VMIN]=1;或者您认为合适的任何值。

这是有关规范与否的重要信息来源。 http://www.gnu.org/software/libc/manual/html_node/Canonical-or-Not.html#Canonical-or-Not

关于c - 如果未设置规范模式,非阻塞读取会失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16382734/

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