常见两种情况:
①:键盘即插即用:怎么检测键盘接入与拔出?
1.hotplug:内核发现键盘接入或者拔出---->启动hotplug进程—>将消息传送给输入系统
2.inotify:输入系统使用inotify检测目录: /dev/input
②:可使用多键盘:怎么知道哪个键盘被按下?采用epoll
意思就是可以检测多个文件:有无数据供读出,有无数据供写入
一、inotify的使用(监测目录/文件的变化)
①:fd = inotify_init()
②: inotify_add_watch( 目录/文件, 创建/删除)
③:read(fd )
返回结果:多个下列结构体,而且结构体长度可能不一样
struct inotify_event {
__s32 wd; /* watch descriptor */
__u32 mask; /* watch mask 检测发生了什么变化*/
__u32 cookie; /* cookie to synchronize two events */
__u32 len; /* length (including nulls) of name name的长度*/
char name[0]; /* stub for possible name 发生变化的文件*/
};
通过inotify监测系统目录下一个文件夹的文件的添加和删除
#include <unistd.h>
#include <stdio.h>
#include <sys/inotify.h>
#include <string.h>
#include <errno.h>
/*
*参考: frameworks\native\services\inputflinger\EventHub.cpp
*/
/*Usage: inotify <dir> */
int read_process_inotify_fd(int fd)
{
int res;
char event_buf[512];
int event_size;
int event_pos = 0;
struct inotify_event *event;
/* read */
res = read(fd, event_buf, sizeof(event_buf));
if(res < (int)sizeof(*event)) {
if(errno == EINTR)
return 0;
printf("could not get event, %s\n", strerror(errno));
return -1;
}
/* process
* 读到的数据是1个或多个inotify_event
* 它们的长度不一样
* 逐个处理
*/
while(res >= (int)sizeof(*event)) {
event = (struct inotify_event *)(event_buf + event_pos);
//printf("%d: %08x \"%s\"\n", event->wd, event->mask, event->len ? event->name : "");
if(event->len) {
if(event->mask & IN_CREATE) {
printf("create file: %s\n", event->name);
} else {
printf("delete file: %s\n", event->name);
}
}
event_size = sizeof(*event) + event->len;
res -= event_size;
event_pos += event_size;
}
return 0;
}
int main(int argc, char **argv)
{
int mINotifyFd;
int result;
if (argc != 2)
{
printf("Usage: %s <dir>\n", argv[0]);
return -1;
}
/* inotify_init */
mINotifyFd = inotify_init();
/* add watch */
result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE);
/* read */
while (1)
{
read_process_inotify_fd(mINotifyFd)