博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓输入子系统之inotify与epoll机制【学习笔记】【原创】
阅读量:5235 次
发布时间:2019-06-14

本文共 3783 字,大约阅读时间需要 12 分钟。

平台信息:

内核:linux3.1.0
系统:5.0
平台:tiny4412

作者:庄泽彬(欢迎转载,请注明作者)

说明: 韦老师的安卓视频学习笔记

一、在安卓的输入子系统中如何监听文件的产生以及监听文件是否有数据的输入,文件的监听主要使用的是inotify机制来监听文件的创建以及删除。使用epoll可以用来监听文件是否有数据的变化。下面针对这两种机制分别编程,简单的了解以及如何使用.

二、使用inotify监听文件的创建以及删除.

2.1我们先来看看现象之后在来看看具体的代码是如何实现的把。

在后台运行的inotify可以检测到文件的创建以及删除。

2.2代码的实现

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

编译命令:gcc -o inotify inotify.c,之后按照2.1截图的步骤运行即可。

三、使用epoll来监听文件是否有数据的写入.

3.1代码的具体实现如下:

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 9 10 static const int EPOLL_SIZE_HINT = 8;11 static const int EPOLL_MAX_EVENTS = 16;12 13 #define DATA_MAX_LEN 51214 15 16 int add_to_epoll(int fd,int epollfd)17 {18 int result;19 struct epoll_event eventItem;20 21 memset(&eventItem, 0, sizeof(eventItem));22 eventItem.events = EPOLLIN;23 eventItem.data.fd = fd;24 result = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &eventItem);25 26 return result;27 }28 29 void rm_from_epoll(int fd,int epollfd)30 {31 epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL); 32 }33 34 int main(int argc,char **argv)35 {36 int mEpollFd;37 int tmp_fd;38 int pollResult;39 int i;40 int len;41 char buf[DATA_MAX_LEN];42 43 struct epoll_event mPendingEventItems[EPOLL_MAX_EVENTS];44 45 if(argc < 2){46 printf("Usage: %s
[file2] [file3]\r\n",argv[0]);47 return -1;48 }49 50 51 mEpollFd = epoll_create(EPOLL_SIZE_HINT);52 if (mEpollFd < 0){53 printf("Error epoll_create\r\n");54 return -1;55 }56 57 for(i = 0;i < argc;i ++){58 tmp_fd = open(argv[i],O_RDWR);59 add_to_epoll(tmp_fd,mEpollFd);60 }61 62 while(1){63 pollResult = epoll_wait(mEpollFd, mPendingEventItems, EPOLL_MAX_EVENTS, -1);64 65 for(i = 0 ;i < pollResult;i ++){66 printf("Reason: 0x%x\r\n",mPendingEventItems[i].events);67 len = read(mPendingEventItems[i].data.fd,buf,DATA_MAX_LEN);68 buf[len] = '\0';69 printf("get data:%s\r\n",buf);70 }71 sleep(5);72 }73 74 75 return 0;76 }

编译文件:gcc -o epoll epoll.c

3.2实验的结果如下:可实现对文件数据输入监听.

 

转载于:https://www.cnblogs.com/zzb-Dream-90Time/p/8052592.html

你可能感兴趣的文章
C#—总结
查看>>
转:C#数据结构和算法学习系列五----基础查找算法
查看>>
制作透明“导航、按钮”
查看>>
Java基础(八)异常处理
查看>>
分布式系统概述
查看>>
函数执行时间查看效率
查看>>
Vue Cli3 TypeScript 搭建工程
查看>>
第四次作业1
查看>>
2.17 数组循环移位
查看>>
day 15
查看>>
java 序列化和反序列化的实现原理
查看>>
Intellij IDEA打开多项目窗口
查看>>
pandas层级索引1
查看>>
iOS archiveRootObject 归档失败问题
查看>>
动态规划:HDU1059-Dividing(多重背包问题的二进制优化)
查看>>
python04
查看>>
框架介绍
查看>>
使用AVCaptureSession捕捉视频
查看>>
pl/sql学习(4): 包package
查看>>
图像对比度和亮度
查看>>