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

本文共 3723 字,大约阅读时间需要 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实验的结果如下:可实现对文件数据输入监听.

 

你可能感兴趣的文章
《善用佳软:高效能人士的软件应用之道》一2.4 项目管理:免费Project查看软件汇总...
查看>>
千元悬赏修复 OSC iPhone 客户端网络连接问题
查看>>
iOS 再现奇葩漏洞,恶意视频导致设备死机
查看>>
我自找的,开除我吧
查看>>
Galera 将死 — MySQL Group Replication 发布
查看>>
《基于ArcGIS的Python编程秘笈(第2版)》——1.4 总结
查看>>
Mozilla 发现用于中间人攻击的证书
查看>>
Docker 中管理数据 【已翻译100%】
查看>>
《Unity 5.x游戏开发实战》一2.2 Unity中的C#脚本
查看>>
《OOD启思录》—第2章2.3节 类耦合与内聚
查看>>
【好书推荐】适合开发者学习DevOps的5本好书
查看>>
11个Linux基础面试问题
查看>>
《嵌入式 Linux C 语言应用程序设计(修订版)》一导读
查看>>
《Python金融大数据分析》一2.3 延伸阅读
查看>>
《Cocos2d 跨平台游戏开发指南(第2版)》一2.7 添加过渡效果
查看>>
《从缺陷中学习C/C++》——6.10 delete与delete[]的区别
查看>>
ThinkPHP中的RBAC
查看>>
2015级C++第12周实践项目 运算符重载(一)
查看>>
Android View事件传递详解
查看>>
力荐:一条update语句引发的“血案”
查看>>