#include <sys/inotify.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
/*
它提供了一种监控文件系统(基于inode的)事件的机制,
可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序
inotify既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。
此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。
inotify 使用方法
使用inotify_init 创建一个inotify实例
然后使用inotify_add_watch增加某一项inotify监控项、也可以使用inotify_rm_watch删除一个监控项
使用read 从inotify的文件描述符中读取事件,以判定发生了那些事件
本代码参考android android\frameworks\native\services\inputflinger\EventHub.cpp
*/
int readNotifyLocked(int mINotifyFd,char *monitor_path) {
int res;
char devname[1024];
char *filename;
char event_buf[512];
int event_size;
int event_pos = 0;
struct inotify_event *event;
res = read(mINotifyFd, event_buf, sizeof(event_buf));
if(res < (int)sizeof(*event)) {
if(errno == EINTR)
return 0;
return -1;
}
//printf("got %d bytes of event information\n", res);
strcpy(devname, monitor_path);
filename = devname + strlen(devname);
*filename++ = '/';
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) {
strcpy(filename, event->name);
if(event->mask & IN_CREATE) {
printf("create file %s \r\n",filename);
} else {
printf("delete file %s \r\n",filename);
}
}
event_size = sizeof(*event) + event->len;
res -= event_size;
event_pos += event_size;
}
return 0;
}
//使用方式: 命令 + 监控的目录
int main(int argc,char **argv)
{
int ret = 0;
int mINotifyFd;
char *monitor_path;
if(argc < 2)
{
printf("parm err :\r\n");
printf("usage: devicePath ");
return -1;
}
//要监控的目录
monitor_path = argv[1];
mINotifyFd = inotify_init();
/*添加监控 文件创建及删除工作*/
int result = inotify_add_watch(mINotifyFd, monitor_path, IN_DELETE | IN_CREATE);
if(result < 0)
{
printf("inotify_add_watch monitor %s %s" , monitor_path,strerror(errno));
return -1;
}
while(1)
{
//读取相应的变化
ret = readNotifyLocked(mINotifyFd,monitor_path);
if(ret < 0)
{
printf("could not get event, %s\n", strerror(errno));
break;
}
}
return ret;
}
#include <string.h>
#include <errno.h>
#include <stdio.h>
/*
它提供了一种监控文件系统(基于inode的)事件的机制,
可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序
inotify既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。
此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。
inotify 使用方法
使用inotify_init 创建一个inotify实例
然后使用inotify_add_watch增加某一项inotify监控项、也可以使用inotify_rm_watch删除一个监控项
使用read 从inotify的文件描述符中读取事件,以判定发生了那些事件
本代码参考android android\frameworks\native\services\inputflinger\EventHub.cpp
*/
int readNotifyLocked(int mINotifyFd,char *monitor_path) {
int res;
char devname[1024];
char *filename;
char event_buf[512];
int event_size;
int event_pos = 0;
struct inotify_event *event;
res = read(mINotifyFd, event_buf, sizeof(event_buf));
if(res < (int)sizeof(*event)) {
if(errno == EINTR)
return 0;
return -1;
}
//printf("got %d bytes of event information\n", res);
strcpy(devname, monitor_path);
filename = devname + strlen(devname);
*filename++ = '/';
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) {
strcpy(filename, event->name);
if(event->mask & IN_CREATE) {
printf("create file %s \r\n",filename);
} else {
printf("delete file %s \r\n",filename);
}
}
event_size = sizeof(*event) + event->len;
res -= event_size;
event_pos += event_size;
}
return 0;
}
//使用方式: 命令 + 监控的目录
int main(int argc,char **argv)
{
int ret = 0;
int mINotifyFd;
char *monitor_path;
if(argc < 2)
{
printf("parm err :\r\n");
printf("usage: devicePath ");
return -1;
}
//要监控的目录
monitor_path = argv[1];
mINotifyFd = inotify_init();
/*添加监控 文件创建及删除工作*/
int result = inotify_add_watch(mINotifyFd, monitor_path, IN_DELETE | IN_CREATE);
if(result < 0)
{
printf("inotify_add_watch monitor %s %s" , monitor_path,strerror(errno));
return -1;
}
while(1)
{
//读取相应的变化
ret = readNotifyLocked(mINotifyFd,monitor_path);
if(ret < 0)
{
printf("could not get event, %s\n", strerror(errno));
break;
}
}
return ret;
}