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相关的部分. ...
随机推荐
- Oracle实例初始化参数详解
BACKGROUND_DUMP_DEST 显示和设置Oracle数据库相关日志的存放地,Oracle11g后不再可配置,但其值仍可显示相关日志的存放地,对应配置参数为diagnostic_dest U ...
- C/C++内存泄露检测
以下测试基于的gcc版本: gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4Copyright (C) 2013 Free Software Foundation, In ...
- Hbase集群部署及shell操作
本文详述了Hbase集群的部署. 集群部署 1.将安装包上传到集群并解压 scp hbase-0.99.2-bin.tar.gz mini1:/root/apps/ tar -zxvf hbase-0 ...
- MySQL绿色解压缩版安装与配置
操作步骤: 一.安装MySQL数据库 1.下载MySQL-5.6.17-winx64.zip文件.2.解压到指定目录,本例为D:\mysql-5.6.17-winx64.3.修改配置文件,my-def ...
- Java中父类强制转换为子类的可能
之前徒弟问了一个问题, 在Java中, 父类对象到底能不能转换成对应的子类对象? 到底能不能, 今天就来说说这个问题, 先看下面一段代码: package cn.com.hanbinit.test; ...
- [objc explain]: Non-fragile ivars
[objc explain]: Non-fragile ivars (2009-01-27 09:30 PM) Non-fragile instance variables are a hea ...
- UVa 10491 - Cows and Cars(全概率)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- boost::timer库使用
boost::timer boost库定时器使用,需要在编译时加相关链接库 -lboost_timer -lboost_system boost::timer::cpu_timer 和boost::t ...
- Redis数据类型(上)
数据类型 1.string(字符串) 2.hash(哈希,类似java里的Map) 3.list(列表) 4.set(集合) 5.zset(sorted set:有序集合) 6.基数 String(字 ...
- MS12-020蓝屏攻击
MS12-020远程桌面协议RDP拒绝访问漏洞 条件:受害者必须开放RDP协议 开放了3389端口 或者端口改了,知道对方RDP开放的对应端口. 过程:MSF利用 MSF显示为seems down说明 ...