crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> обработка нажатия клавиш на клавиатуре, POSIX,GCC, Linux 4.4.0-72-generic(XUbuntu)
demaker
  опции профиля:
сообщение 21.4.2017, 11:26
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 29.1.2013
Пользователь №: 3691

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пытаюсь написать программу для обработки(по событию) нажатия кнопок на клавиатуре .
Хочу считывать события с /dev/input/event*. Вроде как там они должны быть.
Программу запускаю из под рута.
Но почему-то
 ret = read(*((int*)fd),&event,sizeof(struct input_event));

Возвращает -1.
Не могу понять почему :unknown:
Помогите разобраться.

Вот код проги.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <linux/input.h>

#define EV_PRESSED 1
#define WRITE_SIZE_BYTES 10

//INIT DEVICE KEYBOARD
int init_keyboard(int *fd)
{
    //file buffer keyboard
    char *keyboard = "/dev/input/event3";

    if(getuid() != 0){
        printf("You are not root! This may not work...\n");
        return -1;
    }

    if((*fd = open(keyboard,O_RDONLY)) == -1){
        printf("%s is not a valid keyboard. \n",keyboard);
        return -1;
    }

    fcntl(*fd,F_SETFL,FNDELAY);

    printf("file %s opened\n",keyboard);

    return 0;
}

//ROUTINE KEY_PRESSED
void* update_keyboard(void *fd)
{
    struct input_event event;
    int ret;
    char ch;

    while(1){
        usleep(100000);
        ret = read(*((int*)fd),&event,sizeof(struct input_event));
        printf("ret = %d\n",ret);
        if(event.type == EV_KEY){
            printf("EV_KEY\n");
            if(event.value == EV_PRESSED){
                if(event.code == KEY_ESC){
                    printf("!!!__PRESSED_ESC__!!!");
                }
            }
        }
    }
}

int main(void)
{
    int fd_keyboard,status;
    pthread_t thread_keyboard;


    if(!init_keyboard(&fd_keyboard)){
        //create thread read key of keyboard
        printf("create thread keyboard read\n");
        status = pthread_create(&thread_keyboard,NULL,update_keyboard,(void*)(&fd_keyboard));
        if(status != 0){
            printf("error create thread keyboard read\n");
            exit(-1);
        }

        if(!pthread_detach(thread_keyboard)){
            printf("detach thread read keyboard\n");
        }
    }
    
       while(1){
               //MAIN LOOP  
       }

    return 0;
}



Сообщение отредактировал demaker - 21.4.2017, 11:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.6.2018, 19:25