Пытаюсь считать нажатия кнопок на клавиатуре с помощью событий.
Хочу считывать события с /dev/input/event*. Вроде как должен быть файл связанный с клавиатурой.
Запускаю программу из под рута.
Но почему-то
ret = read(*((int*)fd),&event,sizeof(struct input_event));
Выдает -1.
Не могу понять
Помогите разобраться.
Вот код программы:
C
#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
//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;
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;
}