这是一个与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
答案 0 :(得分:1)
问题是select()
的第一个参数。 select()
仅检查每个FD集中的前nfds
个描述符。由于您指定了1
,因此它仅检查FD 0上的输入,而忽略了用于/dev/tty
的FD。
将其更改为:
select(fileDescriptor+1, &rdset, NULL, NULL, &timeout );