LINUX.ORG.RU

Опрос клавиатуры


0

0

Никак не удается такая вещь. Делаю программу. она должна ловить символы с клавиатуры и инф. из сети.
Делаю цикл. В нем select'ом опрашиваю сокет и читаю инф из сети. А вот поймать тот факт, что, была нажата клавиша - не удается.
Для select нажен сокет (а где его взять?) poll тоже с stdin ничего ловить не хочет.
А если делаю getc или ncurses'овсский getch (даже в nodelay mode) он висит и ждет, когда введе символ.

Уже все man'ы перерыл. Ничего не нашел

anonymous
Ответ на: комментарий от anonymous

причем здесь curses ? если ты пытаешся при помощи select ловить символы с клавиатуры, то нужно будет произвести некоторые манипуляции с терминалом.

Z0termaNN
()

?????

What if to wait for STDIN file_descriptor?
In any case you can create a thread that
waits for a socket, the other one waits for keyboard:

int fd[2];
pipefd);
tr1:
select(/* socket, fd[0] */);
if(FD_SET(/* fd[0] */)) {
/* keyboard */
} else {
/* socket */
}

tr2:
getch();
char dummy;
write(fd[0], &dummy, 1);

man select:
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
 fd_set rfds;
 struct timeval tv;
 int retval; 

/* Watch stdin (fd 0) to see when it has input. */ FD_ZERO(&rfds);
 FD_SET(0, &rfds);
 /* Wait up to five seconds. */
 tv.tv_sec = 5;
 tv.tv_usec = 0; 

 retval = select(1, &rfds, NULL, NULL, &tv);
 /* Don't rely on the value of tv now! */ 

 if (retval) {
  printf("Data is available now.\n");
 /* FD_ISSET(0, &rfds) will be true. */
 } else {
  printf("No data within five seconds.\n");
 }

 exit(0);
} 
 

yaroslav_v
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.