我们知道OPEN是个阻塞的读取,可见《Linux系统编程》
所以我希望是非阻塞式的。因为驱动是我自己写的,上报事件我是知道的。
所以改为非阻塞代码如下:
#if BLOCKED
event_fd = open(EVENT_NAME, O_RDONLY);
#else
event_fd = open(EVENT_NAME, O_RDONLY | O_NONBLOCK);
#endif
宏代表是需要阻塞读取还是非阻塞读取。
在读的时候,需要改成这样
int key_event_watch(void)
{
ssize_t nr;
memset(&event, 0, sizeof(event));
/*read is blocked api*/
nr = read(event_fd, &event, sizeof(event));
#if (!BLOCKED)
if(nr >= 0){
printf("receive event,%d\n",nr);
} else {
if (errno == EAGAIN){
return KEY_UNPRESSED;
}else{
//error
printf("read event9 ERROR\n");
return KEY_UNPRESSED;
}
}
#endif
if(event.type == EV_SYN){
}
if(event.code == MSC_RAW){
if(event.value == 1){
printf("Key pressed\n");
return KEY_PRESS_CHANGE;
}else{
return KEY_UNPRESSED;
}
}
}
这样就可以解决阻塞读取的问题了。
这里面因为驱动是我自己开发,所以上报数据的内容我是比较清楚的,这里就不说了