1 /*************************************************************************
2 > File Name: inotify.c
3 > 监测一个目录下的文件变化,增加或删除提示
4 > Created Time: Thu 21 Sep 2017 02:41:48 PM CST
5 ************************************************************************/
6
7 #include <stdio.h>
8 #include <sys/inotify.h>
9 #include <string.h>
10 #include <errno.h>
11 #include <fcntl.h>
12
13 int read_process_inotify_fd(int inotify_fd)
14 {
15 int res;
16 char event_buf[512];
17 int event_size;
18 int event_pos = 0;
19 struct inotify_event *event;
20 res = read(inotify_fd, event_buf, sizeof(event_buf));
21 if(res < sizeof(struct inotify_event))
22 {
23 if(errno == EINTR)
24 {
25 return 0;
26 }
27 printf("can not get event ,%s\n",strerror(errno));
28 return -1;
29 }
30
31 while(res >= (int)sizeof(*event)) {
32 event = (struct inotify_event *)(event_buf + event_pos); //指向下一个结构体
33 if(event->len) {
34 if(event->mask & IN_CREATE) {
35 printf("Add device '%s' due to inotify event\n", event->name);
36 } else {
37 printf("Removing device '%s' due to inotify event\n", event->name);
38 }
39 }
40 event_size = sizeof(*event) + event->len;
41 res -= event_size;
42 event_pos += event_size; //跳转到下一个结构体
43 }
44 return 0;
45 }
46
47 int main(int argc ,char **argv)
48 {
49 int fd;
50 if(argc < 2)
51 {
52 printf("Usage: %s <dir>\n",argv[0]);
53 return -1;
54 }
55 // inotify_init
56 fd = inotify_init();
57 // add watch
58 //添加监控:argv[1]监控目录,IN_DELETE|IN_CREATE 监控 创建和删除
59 inotify_add_watch(fd, argv[1], IN_DELETE|IN_CREATE);
60 // read
61 while(1)
62 {
63 read_process_inotify_fd(fd);
64 }
65 return 0;
66 }