2015-03-25 3 views
0

Мне нужно использовать/dev/input/event0 для просмотра ключевых событий. Я использовал inotify_add_watch(), но вызов read() hangs.But If I кот/DEV/вход/event0 я могу увидеть некоторые events.Please, дайте мне знать, что wrong.Below мой фрагмент кодаread() зависает во время просмотра event0 с помощью inotify

/создания экземпляра Inotify/ FD = inotify_init();

/*checking for error*/ 
    if (fd < 0) { 
      perror("inotify_init"); 
    } 
    /*adding the /dev/input/event0 to watch list.*/ 
    wd = inotify_add_watch(fd, "/dev/input/event0", IN_ALL_EVENTS); 
    if (wd < 0){ 
      perror("inotify_add_watch"); 
      exit(-1); 
    } 
    for (;;) { 
    length = read(fd, buffer,EVENT_BUF_LEN); 
    printf("length = %d",length); 
      if (length == 0) 
        perror("read() from inotify fd returned 0!"); 

      if (length < 0) 
        perror("read"); 
    printf("Read %ld bytes from inotify fd\n", (long) numRead); 

ответ

0

Вы не объяснили, почему, по вашему мнению, вам нужно использовать inotify для этого. Я предполагаю, что вы просто хотите программно проверить, готово ли событие.

Вы можете сделать что-то вроде:

int fd = open("/dev/input/event0", O_RDONLY|O_NONBLOCK); 
struct pollfd pfd; // see man 2 poll 
pfd.fd = fd; 
pfd.events = POLLIN; 
if (poll(&pfd, 1, &ts, 1000 /* milliseconds */) > 0) { 
    // reading from fd now will not block 
} 

Это будет ждать до 1 секунды (1000 миллисекунд) для события, чтобы быть готовы к чтению. Вы можете изменить тайм-аут на все, что вам нужно. Вы также можете использовать 0, чтобы проверить, доступны ли данные, не ожидая.