Linux C select: передача эха на ввод работает, а чтение с клавиатуры - нет? - PullRequest
0 голосов
/ 06 мая 2010

Я пытаюсь понять 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

1 Ответ

0 голосов
/ 06 мая 2010

Стандартный ввод - это буферный поток. Вызов select () не сможет обнаружить наличие ввода, пока не будет нажата новая строка в конце ввода. Вы не можете использовать select () для чтения отдельных нажатий клавиш.

...