inotify和epoll
参考EventHub.cpp
1、初始化inotify
int mINotifyFd = inotify_init();
2、将要监测的目录添加到inotify
int result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE);
3、读inotify有没有event
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/inotify.h>
#include <stdio.h> int read_process_inotify_fd(int fd)
{
int res;
char event_buf[];
int event_size;
int event_pos = ;
struct inotify_event *event;
res = read(fd, event_buf, sizeof(event_buf));
if(res < (int)sizeof(*event)) {
if(errno == EINTR)
return ;
printf("could not get event, %s\n", strerror(errno));
return -;
}
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 ; } int main(int argc, char **argv)
{
int ret;
if (argc != ) {
printf("Usage: %s <dir>\n", argv[]);
return -;
} int mINotifyFd = inotify_init();
int result = inotify_add_watch(mINotifyFd, argv[], IN_DELETE | IN_CREATE);
if (result < ) {
printf("inotify_add_watch error\n");
return -;
}
while () {
ret = read_process_inotify_fd(mINotifyFd);
if (ret) {
printf("read_process_inotify_fd error\n");
return -;
}
} return ;
}
1、创建epoll
int mEpollFd = epoll_create(5);
2、打开fifo路径,添加到epoll
3、epoll_wait
4、读数据
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <unistd.h> /*
*
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t; struct epoll_event {
uint32_t events; /* Epoll events */
/* epoll_data_t data; /* User data variable */
/* };
*/ #define MAXEVENTS 10
#define MAXLEN 512
static struct epoll_event eventItem[MAXEVENTS]; int epoll_add_watch(int mEpollFd, int fd)
{
struct epoll_event eventItem;
memset(&eventItem, , sizeof(eventItem));
eventItem.events = EPOLLIN;
eventItem.data.fd = fd;
int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem);
return result;
} int main(int argc, char **argv)
{
int res;
char buf[MAXLEN];
if (argc < ) {
printf("Usage: ./epoll <fifo1> <fifo2> ...\n");
return -;
}
int mEpollFd = epoll_create(); //最多监听5个文件
if (mEpollFd < ) {
printf("epoll_create error\n");
return -;
} int i;
for (i = ; i < argc; i++) {
int fd = open(argv[i], O_RDWR);
if (fd < ) {
printf("open %s error\n", argv[i]);
return -;
}
res = epoll_add_watch(mEpollFd, fd);
if (res) {
printf("epoll_add_watch error\n");
return -;
}
} while () {
int poll_result = epoll_wait(mEpollFd, eventItem, MAXEVENTS, -);
for (i = ; i < poll_result; i++) {
int len = read(eventItem[i].data.fd, buf, MAXLEN);
buf[len] = '\0';
printf("get data : %s\n", buf);
}
}
return ; }
inotify和epoll同时使用,即能监测到有没有新的文件创建,还能读出文件内容
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/inotify.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/epoll.h> static int mEpollFd;
#define MAXEVENTS 10
#define MAXLEN 512
#define MAXFD 512 static char *DIR_NAME;
static struct epoll_event eventItem[MAXEVENTS]; char *file_and_fd[MAXFD]; int epoll_add_watch(int fd)
{
struct epoll_event eventItem;
memset(&eventItem, , sizeof(eventItem));
eventItem.events = EPOLLIN;
eventItem.data.fd = fd;
int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem);
return result;
} void epoll_rm_watch(int fd)
{
epoll_ctl(mEpollFd, EPOLL_CTL_DEL, fd, NULL); } //打开文件并加入epoll监听
int open_file_add_epoll(char *filename)
{
int fd = open(filename, O_RDWR);
if (fd < ) {
printf("open %s error\n", filename);
return -;
}
file_and_fd[fd] = filename;
int res = epoll_add_watch(fd);
if (res) {
printf("epoll_add_watch error\n");
return -;
}
} int find_fd(char *name)
{
int i;
for (i = ; i < MAXFD; i++) {
if (strcmp(file_and_fd[i], name) == )
return i;
}
return -;
} int read_process_inotify_fd(int fd)
{
int res;
char file_path[];
char event_buf[];
int event_size;
int event_pos = ;
struct inotify_event *event;
res = read(fd, event_buf, sizeof(event_buf));
if(res < (int)sizeof(*event)) {
if(errno == EINTR)
return ;
printf("could not get event, %s\n", strerror(errno));
return -;
}
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) {
sprintf(file_path, "%s/%s", DIR_NAME, event->name);
if(event->mask & IN_CREATE) {
printf("create file: %s\n", event->name);
open_file_add_epoll(file_path);
} else {
printf("delete file: %s\n", event->name);
int file_fd = find_fd(file_path);
epoll_rm_watch(file_fd);
}
}
event_size = sizeof(*event) + event->len;
res -= event_size;
event_pos += event_size;
}
return ; } int main(int argc, char **argv)
{
int ret;
int i;
if (argc != ) {
printf("Usage: %s <dir>\n", argv[]);
return -;
} char buf[MAXLEN]; int mINotifyFd = inotify_init();
int result = inotify_add_watch(mINotifyFd, argv[], IN_DELETE | IN_CREATE);
if (result < ) {
printf("inotify_add_watch error\n");
return -;
}
DIR_NAME = argv[];
mEpollFd = epoll_create();
if (mEpollFd < ) {
printf("epoll_create error\n");
return -;
} epoll_add_watch(mINotifyFd); //监测目录 while () { int poll_result = epoll_wait(mEpollFd, eventItem, MAXEVENTS, -); for (i = ; i < poll_result; i++) {
if (eventItem[i].data.fd == mINotifyFd) { //有新文件创建, 目录argv[1]里面有变化
ret = read_process_inotify_fd(mINotifyFd);
if (ret) {
printf("read_process_inotify_fd error\n");
return -;
}
}else{ //文件的内容有变化
int len = read(eventItem[i].data.fd, buf, MAXLEN);
buf[len] = '\0';
printf("get data : %s\n", buf);
} }
} return ;
}
inotify和epoll的更多相关文章
- 安卓输入子系统之inotify与epoll机制【学习笔记】【原创】
平台信息:内核:linux3.1.0系统:android5.0平台:tiny4412 作者:庄泽彬(欢迎转载,请注明作者) 说明: 韦老师的安卓视频学习笔记 一.在安卓的输入子系统中如何监听文件的产生 ...
- 输入系统:epoll & inotify
一.epoll 作用:检测一个或多个文件的可读.可写等属性变化: 代码示例: #include <sys/epoll.h> #include <stdio.h> #includ ...
- Android系统--输入系统(一)必备的Linux知识_inotify和epoll
Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...
- 10.1、android输入系统_必备Linux编程知识_inotify和epoll
1. inotify和epoll 怎么监测键盘接入与拔出? (1)hotplug机制:内核发现键盘接入/拔出==>启动hotplug进程==>发消息给输入系统 (2)inotify机制:输 ...
- GO 语言简介(网摘)
GO 语言简介 原文出处:[陈皓 coolshell] Hello World 文件名 HELLO.GO package main //声明本文件的package名 import "fmt& ...
- Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android 工具视频学习笔记_WDS
1. 由于Android源码过于庞大,SourceInsight会经常卡死,不适合了.适合的是Android Studio, 非常好用.使用手册上有介绍如何安装. 编译安卓的过程说明手册中也有. 3. ...
- Go 语言简介(下)— 特性
希望你看到这篇文章的时候还是在公交车和地铁上正在上下班的时间,我希望我的这篇文章可以让你利用这段时间了解一门语言.当然,希望你不会因为看我的文章而错过站.呵呵. 如果你还不了解Go语言的语法,还请你移 ...
- 《深入理解Android 卷III》第五章 深入理解Android输入系统
<深入理解Android 卷III>即将公布.作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白.即Android Framework中和UI相关的部分. ...
随机推荐
- Linux ->> Apt-get命令安装软件
Apt全称Advanced Package Tool.Apt-get适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸载软件或操作系统. 用法: apt-cache ...
- 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果
学习笔记---Javascript事件Event.IE浏览器下的拖拽效果 1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...
- centos7 nginx访问目录403解决
查看 /usr/sbin/sestatusSELinux status是不是enabled 然后 vi /etc/selinux/config修改:SELINUX=disabledreboot
- Effective Java 第二版 Enum
/** * Effective Java 第二版 * 第30条:用enum代替int常量 */ import java.util.HashMap;import java.util.Map; publi ...
- React Native调试技巧与心得
转自:http://blog.csdn.net/quanqinyang/article/details/52215652 在做React Native开发时,少不了的需要对React Native程序 ...
- 20140316 曼联VS利物浦,罗杰斯的小九九,当4312对上4231
一.预测的阵式!? 赛前看fourfourtwo,Whoscored的首发预测,楼主立刻意淫了阵式图,并且大言不惭在微博贴了当晚的热战区域(上图的左侧),并疑惑着,格伦·囧森打左后卫,那这……显然是逼 ...
- UVa 11582 - Colossal Fibonacci Numbers!(数论)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 「LG4178 Tree」
题目 我终于来抄点分治的板子了 随便说一点理解吧,点分治就是一种能求某种特定树上路径数量的算法 就是选择一个分治重心,统计一下以这个重心为\(LCA\)的路径的信息 之后对这个重心的子树再次分别选择分 ...
- php 日志扩展
今天发现一个比较好的php应用日志扩展,这里先mark一下,回头有空再详细介绍: http://neeke.github.io/SeasLog/
- CUDA 深入浅出谈[转]
CUDA 深入浅出谈 “CUDA 是 NVIDIA 的 GPGPU 模型,它使用 C 语言为基础,可以直接以大多数人熟悉的 C 语言,写出在显示芯片上执行的程序,而不需要去学习特定 ...