【发布时间】:2010-05-06 09:42:19
【问题描述】:
我想了解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.
因此,选择程序显然将回声管道识别为输入;但它不会识别终端上的按键。为什么是这样?是否可以使用某种重定向(我猜,类似于屏幕如何将键盘输入“重定向”到串行会话)以便识别终端中的实际按键?
谢谢, 干杯!
select.c:
/*
** select.c -- a select() demo
*/
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#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
【问题讨论】: