怎样在linux内核中添加inotify
答案:2 悬赏:70 手机版
解决时间 2021-03-23 20:25
- 提问者网友:战皆罪
- 2021-03-22 21:24
怎样在linux内核中添加inotify
最佳答案
- 五星知识达人网友:第四晚心情
- 2021-03-22 22:02
这个我们期末考试考过。
inotify只能监控单层目录变化,不能监控子目录中的变化情况。
如果需要监控子目录,需要在调用inotify_add_watch(int fd, char *dir, int mask):int建立监控时,递归建立子目录的监控,伪代码如下
void addwatch(int fd, char *dir, int mask)
{
wd = inotify_add_watch(fd, dir, mask);
向目录集合加入(wd, dir);
for (dir下所有的子目录subdir)
addwatch(fd, subdir, mask);
}
这样就可以得到一个目录集合,其中每一个wd对应一个子目录。
当你调用read获取信息时,可以得到一个下面的结构体
struct inotify_event
{
int wd;
uint32_t mask;
uint32_t cookie;
uint32_t len;
char name __flexarr;
};
inotify只能监控单层目录变化,不能监控子目录中的变化情况。
如果需要监控子目录,需要在调用inotify_add_watch(int fd, char *dir, int mask):int建立监控时,递归建立子目录的监控,伪代码如下
void addwatch(int fd, char *dir, int mask)
{
wd = inotify_add_watch(fd, dir, mask);
向目录集合加入(wd, dir);
for (dir下所有的子目录subdir)
addwatch(fd, subdir, mask);
}
这样就可以得到一个目录集合,其中每一个wd对应一个子目录。
当你调用read获取信息时,可以得到一个下面的结构体
struct inotify_event
{
int wd;
uint32_t mask;
uint32_t cookie;
uint32_t len;
char name __flexarr;
};
全部回答
- 1楼网友:大漠
- 2021-03-22 23:04
有时候我们需要检测某个目录下文件或者子目录的改动状况,如添加、删除、以及更新等,linux系统上提供了inotify来完成这个功能。inotify是在版本2.6.13的内核中首次出现,现在的发行本应该都包含这个系统调用了。
下面的描述中的文件如无特别说明包括文件以及目录
使用inotify的第一步就是调用inotify_init()创建一个inotify实例,该函数返回一个文件描述符。这个文件描述符关联了一个inotify事件队列,通过read读取该文件描述符,就能获取底层的inotify事件。
1
int inotify_fd = inotify_init();
还有另外一个系统调用inotify_init1(int flag),该函数提供了一个参数可用于设置文件描述符属性
1
int inotify_fd = inotify_init1(flag);
其效果与如下代码相同
1
2
int inotify_fd = inotify_init();
fcntl(inotify_fd, f_setfl, flags)
一旦成功创建了inotify实例,获得了相应的文件描述符,下一步就是告诉内核需要关注的文件以及关注的事件类型。这一步是通过函数inotify_add_watch()实现的。
1
int wd = inotify_add_watch(instance_fd, file_name, event_mask)
上面的调用中,file_name就是需要关注的文件,而event_mask是关注的事件类型掩码。目前inotify支持的事件类型包括如下几种
in_access
in_attrib
in_close_write
in_close_nowrite
in_create
in_delete
in_delete_self
in_modify
in_move_self
in_moved_from
in_moved_to
in_open
这里面值得注意的是in_delete、in_move_to和in_delete_self、in_move_self,简单来说带有self结尾的事件,发生在被关注目录自身,而不带self的发生在关注对象的子目录或者子文件之上。例如对于目录a调用inotify_add_watch,如果目录a中的文件b被删除,内核会发出in_delete事件,而目录a被删除,内核发出in_delete_self事件。
如果决定不再关注某个文件,只需调用inotify_rm_watch(instance_fd, wd)即可,其中的wd为inotify_add_watch的返回值。
设置好了关注文件以及事件类型,剩下的就是inotify事件的处理了。
首先第一步就是要获取inotify事件,这一步非常简单,只需要对于instance_fd调用read进行读取即可。注意,read读出的数据只是一些字符序列,你要通过强制转换才能获得inotify_event
1
2
3
4
5
6
7
struct inotify_event {
int wd;
uint32_t mask;
uint32_t cookie;
uint32_t len;
char name[]
};
具体的含义可以使用man命令去看,值得一体的是mask字段和cookie字段。这里的mask字段除了包含事件类型之外,还可能包含其他信息,诸如in_isdir标示事件是否是发生在目录之上,in_umount标示关注对象所在文件系统是否被卸载等。
windows下也有类似的系统调用readdirectorychanges,不过我在freebsd以及aix下都未找到相应的系统调用
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯