永发信息网

怎样在linux内核中添加inotify

答案:2  悬赏:70  手机版
解决时间 2021-03-23 20:25
怎样在linux内核中添加inotify
最佳答案
这个我们期末考试考过。
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;
};
全部回答
有时候我们需要检测某个目录下文件或者子目录的改动状况,如添加、删除、以及更新等,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下都未找到相应的系统调用
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我女朋友的姐姐总是说还有什么想对我说的吗,
林开头的诗句,林字开头霸气诗句
成人本科,考在职研究生,完成后没有学历,可
路达汽车租赁地址好找么,我有些事要过去,
列竖式计算.(带☆的要验算,带*的要保留两
最近有一个汽车广告,背景音乐是美国很多年以
湖南大学第十二学生宿舍这个地址在什么地方,
描述秋天的优美语句,关于描写秋天景物的优美
奥运会上,运动员在上单杠之前,总要在手上擦
西南交通大学是几本?一本么?音乐系呢
目前菲尔普斯是那三个游泳项目的世界纪录保持
所有的燃烧都需要氧气吗?
中考开始时间结束时间怎么填
国家315打假办协会有叫郝兵的人吗
远字开头的五言古诗句,以永,远,祝,福四字
推荐资讯
宝宝感冒流鼻涕可以喝萝卜炖骨头吗
今年奥运中国运动员拿到金牌奖多少钱?
求清迈师傅阿赞的各种联系地址!!!!!!!
绒艾堂亚健康养生馆地址在什么地方,想过去办
根据对话内容,填句子,补全对话。A: 1B: 2.
手机自拍镜头,有什么用?
宝鸡7o路车路线图?
折叠凉席中间的折叠缝坏了怎么修补
购物己申请退款了,商家没反映,明天最后一天退
请问哪家公司的重疾险性价比最高呢!
顺治和董鄂妃的故事
庞家岩村在哪里啊,我有事要去这个地方
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?