【发布时间】:2022-01-14 21:51:35
【问题描述】:
我正在尝试使用“select()”来测试一个键是否被敲击然后读取它。它有点工作,但只有如果在字符后按下 {Enter}。
示例代码如下:
// selectkb.c
#include <stdio.h>
#include <sys/select.h>
//@ Main program
int
main(
int argc,
char **argv)
{
int n;
fd_set readfds;
FD_ZERO( &readfds );
FD_SET( 0, &readfds );
printf( "calling select on fd 0...\n" );
n = select( 1, &readfds, NULL, NULL, NULL );
printf( "select reports %d fd ready\n", n );
if( FD_ISSET( 0, &readfds ) ) {
char c;
printf( "select reports fd 0 ready.\n" );
c = getchar();
printf( "getchar returned \"%c\"\n", c );
}
else {
printf( "fd 0 not ready.\n" );
}
return( 0 );
}
如果我按 A 没有任何反应, 但如果我按 A{Enter},则输出为:
calling select on fd 0...
select reports 1 fd ready
select reports fd 0 ready.
getchar returned "A"
如果我按 ABC{Enter} 输出是一样的
为什么需要 {Enter}?
(注意:我知道还有其他方法可以做到这一点,但在我的实际应用中,我选择了一些套接字以及 fd0,但为了简洁起见,我省略了)
【问题讨论】:
-
具体来说,在熟模式下,终端(或伪 tty)实际上不会将输入发布到您的
stdin,直到用户按下 Enter。 -
@Ben,我认为你一针见血。现在我必须弄清楚如何解决它......