安卓输入子系统之inotify与epoll机制学习笔记原创

知是行的主意,行是知的功夫。这篇文章主要讲述安卓输入子系统之inotify与epoll机制学习笔记原创相关的知识,希望能为你提供帮助。
平台信息:
内核:linux3.1.0
系统:android5.0
平台:tiny4412
作者:庄泽彬(欢迎转载,请注明作者)
说明: 韦老师的安卓视频学习笔记
一、在安卓的输入子系统中如何监听文件的产生以及监听文件是否有数据的输入,文件的监听主要使用的是inotify机制来监听文件的创建以及删除。使用epoll可以用来监听文件是否有数据的变化。下面针对这两种机制分别编程,简单的了解以及如何使用.
二、使用inotify监听文件的创建以及删除.
2.1我们先来看看现象之后在来看看具体的代码是如何实现的把。

安卓输入子系统之inotify与epoll机制学习笔记原创

文章图片

在后台运行的inotify可以检测到文件的创建以及删除。
2.2代码的实现
1 #include < unistd.h> 2 #include < stdio.h> 3 #include < sys/inotify.h> 4 #include < string.h> 5 #include < errno.h> 6 7 8 int read_process_inotify_fd(int fd) 9 { 10char event_buf[512]; 11int event_size; 12int event_pos = 0; 13int res; 14struct inotify_event *event; 15 16 17res = read(fd, event_buf, sizeof(event_buf)); 18if(res < (int)sizeof(*event)) { 19if(errno == EINTR) 20return 0; 21printf("could not get event, %s\\n", strerror(errno)); 22return -1; 23} 24 25while(res > = (int)sizeof(*event)) { 26event = (struct inotify_event *)(event_buf + event_pos); 27//printf("%d: %08x \\"%s\\"\\n", event-> wd, event-> mask, event-> len ? event-> name : ""); 28if(event-> len) { 29if(event-> mask & IN_CREATE) { 30//openDeviceLocked(devname); 31printf("Create file: %s\\r\\n",event-> name); 32} else { 33//closeDeviceByPathLocked(devname); 34printf("delete file: %s\\r\\n",event-> name); 35} 36} 37event_size = sizeof(*event) + event-> len; 38res -= event_size; 39event_pos += event_size; 40} 41 42return 0; 43 44 } 45 46 int main(int argc,char **argv) 47 { 48int mINotifyFd; 49int result; 50 51if (argc != 2){ 52printf("Usage: %s < dir> \\r\\n",argv[0]); 53return -1; 54} 55 56mINotifyFd = inotify_init(); 57if (mINotifyFd < = 0){ 58printf("Error inotify_init\\r\\n"); 59return -1; 60} 61 62 63result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE); 64 65while(1){ 66read_process_inotify_fd(mINotifyFd); 67} 68 69 70 71return 0; 72 }

编译命令:gcc -o inotify inotify.c,之后按照2.1截图的步骤运行即可。
三、使用epoll来监听文件是否有数据的写入.
3.1代码的具体实现如下:
1 #include < sys/epoll.h> 2 #include < stdio.h> 3 #include < unistd.h> 4 #include < sys/types.h> 5 #include < sys/stat.h> 6 #include < fcntl.h> 7 #include < string.h> 8 9 10 static const int EPOLL_SIZE_HINT = 8; 11 static const int EPOLL_MAX_EVENTS = 16; 12 13 #define DATA_MAX_LEN 512 14 15 16 int add_to_epoll(int fd,int epollfd) 17 { 18int result; 19struct epoll_event eventItem; 20 21memset(& eventItem, 0, sizeof(eventItem)); 22eventItem.events = EPOLLIN; 23eventItem.data.fd = fd; 24result = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, & eventItem); 25 26return result; 27 } 28 29 void rm_from_epoll(int fd,int epollfd) 30 { 31epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL); 32 } 33 34 int main(int argc,char **argv) 35 { 36int mEpollFd; 37int tmp_fd; 38int pollResult; 39int i; 40int len; 41char buf[DATA_MAX_LEN]; 42 43struct epoll_event mPendingEventItems[EPOLL_MAX_EVENTS]; 44 45if(argc < 2){ 46printf("Usage: %s < file1> [file2] [file3]\\r\\n",argv[0]); 47return -1; 48} 49 50 51mEpollFd = epoll_create(EPOLL_SIZE_HINT); 52if (mEpollFd < 0){ 53printf("Error epoll_create\\r\\n"); 54return -1; 55} 56 57for(i = 0; i < argc; i ++){ 58tmp_fd = open(argv[i],O_RDWR); 59add_to_epoll(tmp_fd,mEpollFd); 60} 61 62while(1){ 63pollResult = epoll_wait(mEpollFd, mPendingEventItems, EPOLL_MAX_EVENTS, -1); 64 65for(i = 0 ; i < pollResult; i ++){ 66printf("Reason: 0x%x\\r\\n",mPendingEventItems[i].events); 67len = read(mPendingEventItems[i].data.fd,buf,DATA_MAX_LEN); 68buf[len] = \'\\0\'; 69printf("get data:%s\\r\\n",buf); 70} 71sleep(5); 72} 73 74 75return 0; 76 }

编译文件:gcc -o epoll epoll.c
3.2实验的结果如下:可实现对文件数据输入监听.
安卓输入子系统之inotify与epoll机制学习笔记原创

文章图片

【安卓输入子系统之inotify与epoll机制学习笔记原创】 

    推荐阅读