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()来读取单个击键。