Linux内核之内核通知文件系统创建的路径:fsnotify_create用法实例(五十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.Linux内核之fsnotify_create介绍
      • 🐓2.1 问题一:新的文件或目录是被谁创建的?为什么要通知文件系统?
      • 🐓2.2 问题二:内核空间创建文件或目录要通知文件系统吗?内核和文件系统是什么关系?
    • 🌻3.代码实例
      • 🐓3.1 监视文件创建并记录到内核日志
      • 🐓3.2 实时监控文件系统中的新文件并通知用户空间程序
      • 🐓3.3 监控文件创建并触发定时器

🌻1.前言

本篇目的:Linux内核之内核通知文件系统创建的路径:fsnotify_create用法实例

🌻2.Linux内核之fsnotify_create介绍

  • fsnotify_create 函数是 Linux 内核中的一个函数,用于通知文件系统中的文件或目录创建事件。当新的文件或目录被创建时,内核会调用 fsnotify_create 函数来向文件系统通知机制注册相应的创建事件监听器。

  • 函数实现:

static inline void fsnotify_create(struct inode *inode, struct dentry *dentry)
{// 审计文件系统事件:通知有新的子节点被创建audit_inode_child(inode, dentry, AUDIT_TYPE_CHILD_CREATE);// 发送文件系统通知事件:文件被创建fsnotify(inode, FS_CREATE, dentry->d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0);
}
  • 参数说明:
    inode:新创建的文件或目录所属的父目录的索引节点。
    dentry:新创建的文件或目录的目录项(dentry)。

  • 函数作用:

  • 审计文件系统事件: 调用 audit_inode_child 函数来进行文件系统事件的审计记录。这个步骤通常用于记录文件系统中的重要操作,如文件的创建、删除等。在这里,它记录了一个子节点的创建事件。

  • 发送文件系统通知事件: 调用 fsnotify 函数来发送文件系统通知事件。这个事件通知了文件系统的监听器,有一个新的文件或目录被创建。通常,文件系统通知机制会通过注册监听器的方式来监视文件系统中的特定事件,并在事件发生时通知相关的监听器。
    实现意义:

  • fsnotify_create 函数的主要作用是向文件系统通知机制注册新创建文件或目录的事件监听器。通过调用这个函数,内核可以通知文件系统的监听器,以便它们能够在文件或目录创建时执行相应的操作。这个函数是文件系统通知机制的一部分,用于提供文件系统的监视和通知功能,以实现文件系统的高级功能,如实时监控、日志记录等。

🐓2.1 问题一:新的文件或目录是被谁创建的?为什么要通知文件系统?

  • 新的文件或目录通常是由用户空间的应用程序或者其他内核模块创建的。例如,一个用户可以通过命令行工具或者图形化文件管理器创建文件或目录。另外,内核模块也有可能通过系统调用或其他方式创建文件或目录。

  • 通知文件系统的目的在于让文件系统的其他部分或者用户空间的程序知晓文件系统的变化。这样做有几个主要原因:

  • 实时监控: 文件系统通知机制允许程序实时监控文件系统的变化,例如文件或目录的创建、修改、删除等操作。这对于需要实时监控文件系统状态的应用程序非常有用,如文件同步工具、实时备份程序等。

  • 自动化处理: 文件系统通知机制可以触发自动化处理,让程序根据文件系统的变化执行相应的操作。例如,当有新文件创建时,可以自动对其进行备份或者转码处理。

  • 日志记录和审计: 文件系统通知机制可以用于记录文件系统中的重要操作,如文件的创建、修改、删除等。这对于系统管理员进行日志记录和审计非常重要,可以帮助追踪文件系统操作的来源和时间。

  • 综上所述,通知文件系统的目的是为了让系统的其他部分或者用户空间的程序能够及时了解文件系统的变化,从而进行相应的处理、监控或记录。这对于实现文件系统的实时监控、自动化处理和日志记录非常重要。

🐓2.2 问题二:内核空间创建文件或目录要通知文件系统吗?内核和文件系统是什么关系?

  • 内核空间创建文件或目录时,通常是由内核中的某个模块、驱动程序或者内核线程进行的。

  • 通知文件系统: 内核空间创建文件或目录时,通常需要通知文件系统,以便文件系统能够更新自身的数据结构,并在需要时通知其他部分或用户空间的程序。这种通知机制通常通过文件系统提供的相应接口或者文件系统通知机制来实现。

  • 关系: 内核和文件系统之间的关系可以理解为内核是文件系统的基础,文件系统则是内核的一个重要模块。文件系统是内核提供的一种机制,用于组织和管理存储在存储介质上的文件和目录。在 Linux 内核中,文件系统由一系列的数据结构、算法和接口组成,用于实现文件的存储、访问和管理等功能。内核空间的其他模块和驱动程序可以利用文件系统提供的接口和机制来进行文件的创建、读写、删除等操作。因此,内核和文件系统是相互依赖、相互作用的关系。

  • 总之,内核空间创建文件或目录时通常需要通知文件系统,以维护文件系统的一致性和完整性。内核和文件系统之间是相互依赖、相互作用的关系,文件系统是内核提供的重要功能之一,用于管理存储在存储介质上的文件和目录。

🌻3.代码实例

🐓3.1 监视文件创建并记录到内核日志

#include <linux/fs.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/namei.h>
#include <linux/fsnotify.h>// 文件创建事件处理函数
static void file_create_event(struct inode *inode, struct dentry *dentry)
{// 记录文件创建事件到内核日志pr_info("File created: %s\n", dentry->d_name.name);
}// 文件创建函数
static int myfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool excl)
{// 调用 fsnotify_create 函数注册文件创建事件监听器fsnotify_create(dir, dentry);// 处理文件创建事件file_create_event(dir, dentry);return 0;
}// 文件操作结构体
static const struct file_operations myfs_file_operations = {.create = myfs_create,
};// 模块初始化函数
static int __init myfs_init(void)
{// 注册文件系统register_filesystem(&myfs_type);return 0;
}// 模块退出函数
static void __exit myfs_exit(void)
{// 注销文件系统unregister_filesystem(&myfs_type);
}module_init(myfs_init);
module_exit(myfs_exit);MODULE_LICENSE("GPL");

🐓3.2 实时监控文件系统中的新文件并通知用户空间程序

#include <linux/fs.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/namei.h>
#include <linux/fsnotify.h>
#include <net/sock.h>
#include <linux/netlink.h>#define NETLINK_MYFS 31static struct sock *nl_sk = NULL;// 发送 Netlink 消息到用户空间
static void send_netlink_message(const char *msg)
{struct sk_buff *skb;struct nlmsghdr *nlh;int msg_size = strlen(msg) + 1;int res;if (!nl_sk)return;skb = nlmsg_new(NLMSG_ALIGN(msg_size), GFP_KERNEL);if (!skb) {pr_err("Failed to allocate skb\n");return;}nlh = nlmsg_put(skb, 0, 0, 0, msg_size, 0);strncpy(nlmsg_data(nlh), msg, msg_size);res = nlmsg_unicast(nl_sk, skb, 0);if (res < 0)pr_err("Error while sending message to user space\n");
}// 文件创建事件处理函数
static void file_create_event(struct inode *inode, struct dentry *dentry)
{char msg[256];snprintf(msg, sizeof(msg), "New file created: %s\n", dentry->d_name.name);// 发送 Netlink 消息通知用户空间程序send_netlink_message(msg);
}// 文件创建函数
static int myfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool excl)
{// 调用 fsnotify_create 函数注册文件创建事件监听器fsnotify_create(dir, dentry);// 处理文件创建事件file_create_event(dir, dentry);return 0;
}// 文件操作结构体
static const struct file_operations myfs_file_operations = {.create = myfs_create,
};// 模块初始化函数
static int __init myfs_init(void)
{struct netlink_kernel_cfg cfg = {.input = NULL,};nl_sk = netlink_kernel_create(&init_net, NETLINK_MYFS, &cfg);if (!nl_sk) {pr_err("Failed to create netlink socket\n");return -ENOMEM;}// 注册文件系统register_filesystem(&myfs_type);return 0;
}// 模块退出函数
static void __exit myfs_exit(void)
{// 注销文件系统unregister_filesystem(&myfs_type);// 释放 Netlink 套接字netlink_kernel_release(nl_sk);
}module_init(myfs_init);
module_exit(myfs_exit);MODULE_LICENSE("GPL");

🐓3.3 监控文件创建并触发定时器

#include <linux/fs.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/namei.h>
#include <linux/fsnotify.h>
#include <linux/timer.h>#define TIMER_INTERVAL (5 * HZ)static struct timer_list myfs_timer;// 文件创建事件处理函数
static void file_create_event(struct inode *inode, struct dentry *dentry)
{pr_info("New file created: %s\n", dentry->d_name.name);
}// 定时器回调函数
static void myfs_timer_callback(struct timer_list *timer)
{// 定时器触发时的处理操作,例如检查文件系统中的新文件
}// 文件创建函数
static int myfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool excl)
{// 调用 fsnotify_create 函数注册文件创建事件监听器fsnotify_create(dir, dentry);// 处理文件创建事件file_create_event(dir, dentry);return 0;
}// 文件操作结构体
static const struct file_operations myfs_file_operations = {.create = myfs_create,
};// 模块初始化函数
static int __init myfs_init(void)
{// 初始化定时器setup_timer(&myfs_timer, myfs_timer_callback, 0);// 设置定时器mod_timer(&myfs_timer, jiffies + TIMER_INTERVAL);// 注册文件系统register_filesystem(&myfs_type);return 0;
}// 模块退出函数
static void __exit myfs_exit(void)
{// 删除定时器del_timer(&myfs_timer);// 注销文件系统unregister_filesystem(&myfs_type);
}module_init(myfs_init);
module_exit(myfs_exit);MODULE_LICENSE("GPL");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图解计算机网络】从浏览器地址输入到网页显示的整个过程

从浏览器地址输入到网页显示的整个过程 整体流程DHCPhttp协议报文组装DNSTCP协议封装与TCP三次握手IP协议封装与路由表MAC地址与ARP协议交换机路由器 整体流程 从往浏览器输入一个地址到网页的显示&#xff0c;要经过很长的一个流程&#xff0c;中间涉及到计算机网络的许多知识…

*Linux系统的进程和计划任务管理

目录 一、查看进程 1、程序和进程的关系 *2、ps查看静态进程信息 1&#xff09;ps aux 2&#xff09;ps -elf *3、top查看动态进程信息 4、pgrep查看进程信息 5、pstree查看进程树 二、控制进程 1、进程启动方式 2、进程的前后台调度 3、终止进程的运行 三、计划任…

React【Day4】

路由快速上手 1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候&#xff0c;path 对应的组件会在页面中进行渲染 2. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 …

Git TortoiseGit 安装使用详细教程

前言 Git 是一个免费的开源分布式版本控制系统&#xff0c;是用来保存工程源代码历史状态的命令行工具&#xff0c;旨在处理从小型到非常大型的项目&#xff0c;速度快、效率高。《请查阅Git详细说明》。TortoiseGit 是 Git 的 Windows Shell 界面工具&#xff0c;基于 Tortoi…

第 2 章:FFmpeg简介

2.1 历史 历史 一些相关术语介绍&#xff1a; 容器&#xff08;Container&#xff09;格式&#xff1a;一种文件封装格式&#xff0c;里边主要包含了流&#xff0c;一般会使用一个特定的后缀名标识&#xff0c;例如.mov、.avi、.wav等。流 &#xff08;Stream&#xff09;&am…

政安晨:【Keras机器学习示例演绎】(五)—— 利用视觉变换器进行物体检测

目录 导言 导入和设置 准备数据集 实施多层感知器&#xff08;MLP&#xff09; 实施补丁创建层 显示输入图像的补丁 实施补丁编码层 构建 ViT 模型 运行实验 评估模型 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与…

第二届 Oceanbase 开发者大会 实录

第二届 Oceanbase 开发者大会 实录 今天很有幸参加了Oceanbase 开发者大会&#xff0c;我是真的我一开始还不知道什么是Oceanbase &#xff0c;直到我开了会才知道。看来真的需要多参加一些这样活动。 会议议程 我们科普一下什么是Oceanbase OceanBase 是阿里巴巴集团推出…

如何进行数据库的迁移与同步——【DBA 从入门到实践】第四期

在日常的数据库运维工作中&#xff0c;我们时常会面临数据库替换、机房搬迁、业务测试以及数据库升级等任务&#xff0c;这些任务都需要对数据进行迁移和同步操作。【DBA 从入门到实践】第4期&#xff0c;将引导大家深入了解数据库迁移的流程&#xff0c;并探讨在迁移过程中可用…

AJAX——图书管理案例

1.渲染列表 自己的图书数据&#xff1a;给自己起个外号&#xff0c;并告诉服务器&#xff0c;默认会有三本书&#xff0c;基于这三本书做数据的增删改查。 // 目标1&#xff1a;渲染图书列表 // 1.1 获取数据 // 1.2 渲染数据const creator 哈哈 // 封装-获取并渲染图书列表函…

《QT实用小工具·二十八》基于qt开发的各种曲线

1、概述 源码放在文章末尾 该项目实现了各种曲线的绘制&#xff0c;下面是项目的demo演示&#xff1a; 项目部分代码如下&#xff1a; #include "frmsmoothcurve.h" #include "ui_frmsmoothcurve.h" #include "smoothcurve.h" #include "…

cocos creator 3.6 发布web手机端 加载进度条添加

cocos creator 升级到3.x之后加载进度条取消了&#xff0c;测试了多个3.x版本最终以creator 3.6.3版本&#xff0c;构建了简单的进度加载 参考链接&#xff1a; https://forum.cocos.org/t/topic/137113 打包web-mobile后&#xff0c;没有进度条。加载的时候只显示一个黑屏。…

【小程序】IOS wx小程序解压获取源文件

根据自己手机的系统&#xff0c;获取wx小程序的缓存目录 一、微信小程序文件存放路径 安卓&#xff1a; /data/data/com.tencent.mm/MicroMsg/{{user哈希值}}/appbrand/pkg/iOS越狱&#xff1a; /User/Containers/Data/Application/{{系统UUID}}/Library/WechatPrivate/{{user…

1.为什么选择Vue框架

参考&#xff1a;百战程序员 为什么选择Vue框架 Vue是什么&#xff1f; 渐进式 JavaScript 框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架 为什么要学习Vue Vue是目前前端最火的框架之一Vue是目前企业技术栈中要求的知识点Vue可以…

HarmonyOS 状态管理

在声明式 UI 框架中&#xff0c;数据的改变触发 UI 的重新渲染。在 ArkUI 中不是所有数据的变化都会触发 UI 重新渲染&#xff0c;只有 状态变量 才会引起 UI 重新渲染。 状态变量 状态变量&#xff1a; 指被状态装饰器装饰的变量&#xff0c;只有这种变量的改变才会引起 UI …

【leetcode面试经典150题】63. 删除链表的倒数第 N 个结点(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

软考141-上午题-【软件工程】-杂题+小结

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 真题5&#xff1a; 真题6&#xff1a; 真题7&#xff1a; 真题8&#xff1a; 真题9&#xff1a; 真题10&#xff1a; 真题11&#xff1a; 真题12&#xff1a; 真题13&#xff1a; 真题14&a…

paddlepaddle-gpu安装

背景 之前安装paddlepaddle-gpu遇到各种问题&#xff0c;安装不成功&#xff0c;之前使用了wsldocker的方式&#xff0c;可查看我之前博客&#xff1a;记录paddlepaddle-gpu安装&#xff0c;这要会导致我整个开发流程比较割裂 cuda版本 强烈推荐cuda11.8&#xff0c;paddlep…

SpringBoot项目错误:找不到主类(解决办法)

清理和重新编译项目即可&#xff0c;在项目中点击右键Maven-Reload project&#xff0c;之后再重新运行就行了

蓝桥杯第十五界软件测试线下省赛题目分析及解决

PS 需要第十五界蓝桥杯被测系统或者功能测试模板、单元测试被测代码、自动化测试被测代码请加&#x1f427;:1940787338 备注&#xff1a;15界蓝桥杯省赛软件测试 题目1&#xff1a;功能测试 题目描述 ​ 某物流公司的货运收费标准根据重量、距离和节假日三个因素来确定。如…

聊聊应用商城评分4.9的Apipost IDEA插件

Apipost Helper&#xff0c;作为IDEA插件&#xff0c;可以快速生成和查询API文档&#xff0c;直观友好地在IDE中调试接口。它简化了开发流程并提升效率&#xff0c;即使新手也能够迅速掌握。Apipost Helper提供了诸多便捷功能&#xff0c;如通过代码查找接口或者通过接口查找代…