安卓输入子系统之inotify与epoll机制【学习笔记】【原创】
2017-12-17 17:04
836 查看
平台信息:
内核:linux3.1.0
系统:android5.0
平台:tiny4412
作者:庄泽彬(欢迎转载,请注明作者)
说明: 韦老师的安卓视频学习笔记
一、在安卓的输入子系统中如何监听文件的产生以及监听文件是否有数据的输入,文件的监听主要使用的是inotify机制来监听文件的创建以及删除。使用epoll可以用来监听文件是否有数据的变化。下面针对这两种机制分别编程,简单的了解以及如何使用.
二、使用inotify监听文件的创建以及删除.
2.1我们先来看看现象之后在来看看具体的代码是如何实现的把。
在后台运行的inotify可以检测到文件的创建以及删除。
2.2代码的实现
编译命令:gcc -o inotify inotify.c,之后按照2.1截图的步骤运行即可。
三、使用epoll来监听文件是否有数据的写入.
3.1代码的具体实现如下:
编译文件:gcc -o epoll epoll.c
3.2实验的结果如下:可实现对文件数据输入监听.
内核:linux3.1.0
系统:android5.0
平台:tiny4412
作者:庄泽彬(欢迎转载,请注明作者)
说明: 韦老师的安卓视频学习笔记
一、在安卓的输入子系统中如何监听文件的产生以及监听文件是否有数据的输入,文件的监听主要使用的是inotify机制来监听文件的创建以及删除。使用epoll可以用来监听文件是否有数据的变化。下面针对这两种机制分别编程,简单的了解以及如何使用.
二、使用inotify监听文件的创建以及删除.
2.1我们先来看看现象之后在来看看具体的代码是如何实现的把。
在后台运行的inotify可以检测到文件的创建以及删除。
2.2代码的实现
#include <unistd.h> #include <stdio.h> #include <sys/inotify.h> #include <string.h> #include <errno.h> int read_process_inotify_fd(int fd) { char event_buf[512]; int event_size; int event_pos = 0; int res; struct inotify_event *event; 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; } 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) { //openDeviceLocked(devname); printf("Create file: %s\r\n",event->name); } else { //closeDeviceByPathLocked(devname); printf("delete file: %s\r\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> \r\n",argv[0]); return -1; } mINotifyFd = inotify_init(); if (mINotifyFd <= 0){ printf("Error inotify_init\r\n"); return -1; } result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE); while(1){ read_process_inotify_fd(mINotifyFd); } return 0; }
编译命令:gcc -o inotify inotify.c,之后按照2.1截图的步骤运行即可。
三、使用epoll来监听文件是否有数据的写入.
3.1代码的具体实现如下:
#include <sys/epoll.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> static const int EPOLL_SIZE_HINT = 8; static const int EPOLL_MAX_EVENTS = 16; #define DATA_MAX_LEN 512 int add_to_epoll(int fd,int epollfd) { int result; struct epoll_event eventItem; memset(&eventItem, 0, sizeof(eventItem)); eventItem.events = EPOLLIN; eventItem.data.fd = fd; result = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &eventItem); return result; } void rm_from_epoll(int fd,int epollfd) { epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL); } int main(int argc,char **argv) { int mEpollFd; int tmp_fd; int pollResult; int i; int len; char buf[DATA_MAX_LEN]; struct epoll_event mPendingEventItems[EPOLL_MAX_EVENTS]; if(argc < 2){ printf("Usage: %s <file1> [file2] [file3]\r\n",argv[0]); return -1; } mEpollFd = epoll_create(EPOLL_SIZE_HINT); if (mEpollFd < 0){ printf("Error epoll_create\r\n"); return -1; } for(i = 0;i < argc;i ++){ tmp_fd = open(argv[i],O_RDWR); add_to_epoll(tmp_fd,mEpollFd); } while(1){ pollResult = epoll_wait(mEpollFd, mPendingEventItems, EPOLL_MAX_EVENTS, -1); for(i = 0 ;i < pollResult;i ++){ printf("Reason: 0x%x\r\n",mPendingEventItems[i].events); len = read(mPendingEventItems[i].data.fd,buf,DATA_MAX_LEN); buf[len] = '\0'; printf("get data:%s\r\n",buf); } sleep(5); } return 0; }
编译文件:gcc -o epoll epoll.c
3.2实验的结果如下:可实现对文件数据输入监听.
相关文章推荐
- input子系统学习笔记九 evdev输入事件驱动分析
- 安卓学习笔记---解决在在Edittext输入的时候,输入框被软键盘遮挡部分内容的问题(二)
- 学习笔记 --- LINUX输入子系统分析
- 安卓学习笔记之事件分发机制
- 安卓艺术开发学习笔记之IPC机制
- [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制
- Linux输入子系统学习笔记
- 安卓学习笔记---解决在在Edittext输入的时候,输入框被软键盘遮挡部分内容的问题(一)
- C/C++学习笔记2 - cin深入分析(上) - cin输入操作处理(原创)
- 安卓学习笔记之Android消息机制
- input子系统学习笔记九 evdev输入事件驱动分析
- [原创]java WEB学习笔记70:Struts2 学习之路-- 输入验证,声明式验证,声明是验证原理
- [Linux C语言](学习笔记)标准输入流输出流以及错误流的重定向机制(1)
- input子系统学习笔记九 evdev输入事件驱动分析
- 输入子系统学习笔记
- input子系统学习笔记九 evdev输入事件驱动分析
- Linux驱动学习笔记----------input输入子系统(基本概念与流程)
- [Linux C语言](学习笔记)标准输入流输出流以及错误流的重定向机制(2)
- 学习笔记3-Bootstrap CSS 【转载整理->原创】
- linux模块机制学习笔记