Linux C选择:管道回显到输入工作,但从键盘读取不?

我想了解http://beej.us/guide/bgnet/examples/select.c (包含在下面以供参考)。 我这样做:

:~$ cat /etc/issue Ubuntu 10.04 LTS \n \l :~$ gcc --version gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 :~$ wget http://beej.us/guide/bgnet/examples/select.c :~$ gcc select.c -o select :~$ echo "ff" | ./select A key was pressed! :~$ ./select TYPINGTYTimed out.

 :~$ cat /etc/issue Ubuntu 10.04 LTS \n \l :~$ gcc --version gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 :~$ wget http://beej.us/guide/bgnet/examples/select.c :~$ gcc select.c -o select :~$ echo "ff" | ./select A key was pressed! :~$ ./select TYPINGTYTimed out. 

因此,选择程序显然将回声管道识别为输入; 但它无法识别终端上的按键。 为什么是这样? 可以使用某种重定向(我猜,类似于屏幕可以’将键盘输入重定向到串行会话),以便识别终端中的实际按键?

谢谢,干杯!

select.c:

/* ** select.c -- a select() demo */

 #include  #include  #include  #include  #define STDIN 0 // file descriptor for standard input int main(void) { struct timeval tv; fd_set readfds; tv.tv_sec = 2; tv.tv_usec = 500000; FD_ZERO(&readfds); FD_SET(STDIN, &readfds); // don't care about writefds and exceptfds: select(STDIN+1, &readfds, NULL, NULL, &tv); if (FD_ISSET(STDIN, &readfds)) printf("A key was pressed!\n"); else printf("Timed out.\n"); return 0; } 

编辑:见答案; 因此,我们所需要的只是输入:

 :~$ ./select A key was pressed! 

或者我们可以使用stty raw关闭缓冲输入(并使用stty cooked重新打开):

 :~ stty raw :~ ./select dA key was pressed! :~ stty cooked 

标准输入是缓冲流。 select()调用将无法检测到在输入结束时命中换行符之前有可用输入。 您不能使用这样的select()来读取单个击键。