select()响应标准输入,但不响应/ dev / tty

时间:2020-07-17 22:59:54

标签: c select console termios

这是一个与select() does not seem to work on TTY非常相似的问题,但是我似乎并没有像在这里的OP那样在FD_SET上犯同样的错误。

在我的Linux机器上(运行用于台式机的Ubuntu 20.04 LTS),我试图以阻塞模式(无条件调用fgetc())和非阻塞模式(反复询问{ {1}}是否值得致电select())。

如果我从fgetc()中读取,则这两种模式都可以使用。但是,如果我想独立于stdin是否被重定向而从控制台中显式读取,我的理解是我应该改为打开stdin。这也可以在阻止模式下使用,但不能在非阻止模式下使用:"/dev/tty"在每次超时结束时都保持快速返回0的状态,尽管按下了疯狂的键。我不确定select()stdin在这方面的行为会有何不同。他们的/dev/tty标志似乎相同。

termios

如果我尝试使用$ gcc foo.c $ ./a.out c_iflag = 25862 c_oflag = 5 c_cflag = 191 c_lflag = 35387 Well?? read character 'g' in blocking mode from stdin We're waiting... 0 0 read character 'g' in non-blocking mode from stdin $ ./a.out /dev/tty c_iflag = 25862 c_oflag = 5 c_cflag = 191 c_lflag = 35387 Well?? read character 'g' in blocking mode from /dev/tty We're waiting... 0 0 0 0 0 0 0 0 0 0 too slow: read nothing in non-blocking mode from /dev/tty $ ggggggggggg /dev/console,我只会失败,并返回/dev/tty0中的空FILE *。这是源fopen()。我想念什么?

foo.c

1 个答案:

答案 0 :(得分:1)

问题是select()的第一个参数。 select()仅检查每个FD集中的前nfds个描述符。由于您指定了1,因此它仅检查FD 0上的输入,而忽略了用于/dev/tty的FD。

将其更改为:

select(fileDescriptor+1, &rdset, NULL, NULL, &timeout );