Я пытаюсь понять http://beej.us/guide/bgnet/examples/select.c (включено ниже для справки). Я делаю это:
:~$ cat /etc/issue</p>
<pre><code>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.
Итак, программа выбора, по-видимому, распознает эхо-сигнал в нее как вход; но он не распознает нажатия клавиш на терминале. Почему это? Можно ли использовать какое-то перенаправление (я думаю, похоже на то, как экран может «перенаправить» ввод с клавиатуры на последовательный сеанс), чтобы фактические нажатия клавиш в терминале распознавались?
Спасибо,
Ура! * * 1013
select.c:
/*
** select.c -- a select() demo
*/</p>
<pre><code>#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;
}
Редактировать: см. Ответ; Таким образом, все, что нам нужно, это нажать Enter:
</p>
<pre><code>:~$ ./select
A key was pressed!
или мы можем отключить буферный ввод с помощью stty raw
(и снова включить его с помощью stty cooked
):
</p>
<pre><code>:~ stty raw
:~ ./select
dA key was pressed!
:~ stty cooked