系列文章
目录
1.INotify
1.1 简介
INotify是一个Linux内核所提供的一种文件系统变化通知机制。它可以为应用程序监控文件系统的变化,如文件的创建、删除、读写等。当监听的文件发生相应的操作时,可以通过read函数从INotify中读取事件。
1.2 如何使用?
第一步:通过inotify_init()创建一个inotify对象。
第二步:通过inotify_add_watch将一个或多个监听添加到inotify对象中。
第三步:当事件发生时,通过read()函数从inotify对象中读取监听事件。
第四步:消费事件。
//第一步:通过inotify_init()创建一个inotify对象。
int notifyfd = inotify_init();
//第二步:监听此notify fd
int watchnotifyfd = inotify_add_watch(notifyfd,"/data", IN_CREATE | IN_DELETE);
//监听data目录下是否有设备的添加和删除事件
if (watchnotifyfd < 0) {
return 0;
}
//第三步:当事件发生时,通过read()函数从inotify对象中读取监听事件。
struct inotify_event *event;
char *p;
char buf[256] ={0};
ssize_t recvLen = read(notify_fd, buf, DEFAULT_BUF_LEN);//从notify的fd中读取消息等到buf中
//返回的是读取的字节数
for(p = buf;p<buf +recvLen;)
{
event = (struct inotify_event*) p;
uint32_t len = event->len;//len是event中name的长度
event->name[len] = '\0';//给字符数组最后一位添加\0
if(event ->mask & IN_DELETE)
{//此时是删除设置事件
}
else if(event ->mask & IN_CREATE)//此时是增加设备事件
{
//第四步:消费事件
}
p += sizeof(struct inotify_event) + event->len;//指针向后移动,处理下一个事件
}
1.3 原理介绍
INotify主要有两个基本对象。分别是inotify对象和watch对象。
1.3.1 inotify对象
Inotify对象对应了一个队列,应用程序可以向inotify对象添加多个监听。当监听的文件发生相应的操作时,可以通过read函数从INotify中读取事件。
inotify_init 是一个 Linux 系统调用,用于初始化 inotify实例并返回一个文件描述符,该文件描述符可以用于后续的inotify事件监听。inotify是Linux内核提供的一种文件系统事件监控机制,它允许应用程序监控文件或目录的更改,包括文件的打开、关闭、修改、移动或删除等操作。
创建方法如下:
int inotifyFd = inotify_init();
//inotify_init(void),该函数没有参数,并返回一个非负整数作为inotify实例的文件描述符。
//如果初始化失败,它会返回-1,并设置全局变量errno来指示错误原因。
//一旦你获得了inotify实例的文件描述符,你可以使用inotify_add_watch函数来指定要监控的文件或目录,
//以及你感兴趣的事件类型(如IN_MODIFY、IN_DELETE、IN_CREATE等)。
//然后,你可以使用read系统调用来从inotify实例的文件描述符中读取事件。
1.3.2 Watch对象
watch对象则用来描述文件系统的变化事件的监听。其包含监听目标和事件掩码。监听目标可以文件也可以是文件夹。事件掩码则是监听的事件的类型。文件的创建是IN_CREATE,文件的删除是IN_DELETE等。
其创建方法和inotify对象关联如下:
int watchid = inotify_add_watch (inotifyFd, “/dev/input”,IN_CREATE);
//原型:int inotify_add_watch(int fd, const char *pathname, uint32_t mask);
//参数说明:
//fd:由 inotify_init 返回的 inotify 实例的文件描述符。
//pathname:指向要监视的文件或目录路径的字符串。
//mask:一个位掩码,表示你感兴趣的inotify事件类型。可以使用预定义的宏(如 IN_CREATE、IN_DELETE、IN_MODIFY 等)来指定多个事件类型。
//inotify_add_watch 返回一个非负整数,称为监视描述符(watch descriptor),它唯一标识了新添加的监

本文详细介绍了Linux内核的INotify和Epoll两种文件系统监控机制,包括INotify的使用方法、原理、事件处理,以及如何结合Epoll实现高效事件监听,以提升在大量并发连接中的CPU利用率。
https://blog.youkuaiyun.com/handsomethefirst/article/details/138226266?spm=1001.2014.3001.5501
最低0.47元/天 解锁文章
1269





