watch_mount(), watch_sb(), and fsinfo() (again)

Linux 进程间通信 pipe 实现原理 本文基于 Linux-5.10 版本分析,借助 pipe 分析等待队列,为了下篇文章分析 slect/poll/epoll 实现做准备。pipe 是 Linux 系统中一种比较常用的进程间通信方法,不过使用 pipe 通信的两个进行必须有亲属关系,通常是父子进程。pipe 和 pipe2 返回成功时,pipefd 保存两个文件描述符:pipefd[0] 用于读,pipefd[1] 用于写。 阅读详情

关注了就能看到更多这么棒的文章哦~

watch_mount(), watch_sb(), and fsinfo() (again)

By Jonathan Corbet
February 24, 2020

原文来自:https://lwn.net/Articles/813172/

filesystem的设计目标就是为了减少用户使用时的复杂性。不过,有些时候用户确实希望能看到这个黑盒内部,了解文件系统内部做了些什么事情。David Howells曾经创建了不少针对filesystem的系统调用,为了这个需求,又做了一组patch set增加了3个新的system call。其中1个系统调用我们之前就看到过,另外两个则是全新的。这两个新的系统调用是watch_mount和watch_sb(),它们供进程调用来注册申请,今后在mount point(挂载点)或者是在某个特定的已经mount好的文件系统内部(watch_sb里面的sb指的是superblock)发生变化的时候,这个进程就能收到通知。mount point发生变化,包含在mount point之下mount或者unmount某个文件系统,也包括属性变化,例如read-only、改变挂载点等等。文件系统相关的event也包含一些属性变化,还包括文件系统报错、quota配额问题、远程文件系统的网络问题等。

这些系统调用都是基于Howells近来一直在改善的一个event-notification机制的最新版本的。此前,要想能获取通知,需要先打开一个/dev/watch_queue设备,不过这个接口已经变了。最新版本里面,进程需要调用pipe2(),传入新增的O_NOTIFICATION_PIPE flag,来创建一种特殊的pipe,专用于notification。这个pipe(管道)的写入端不是供application使用的。而pipe的reader端的文件描述符则会传递给下面这两个新增的system call:

    int watch_mount(int dirfd, const char *path, unsigned int flags,
    		    int watch_fd, int watch_id);
    int watch_sb(int dirfd, const char *path, unsigned int flags,
    		 int watch_fd, int watch_id);

在这两种调用中下,dirfd、path和flags都是用来指明所关心的目录的,就跟通常openat()的参数一样。watch_fd则是notification pipe,watch_id则是一个整数值,在所有event里面都会附带返回出来。不过还有个特殊情况,如果watch_id是-1,那么就把现存的监测给删除掉。

应用程序只要对这个管道进行read操作,就可以收到event了。缺省会把所有会影响到这个watch point的event都返回出来。不过应用程序也可以对这个notification pipe进行ioctl()来创建一个filter进行过滤。此外还有一个ioctl()可以来设置容纳这些发给user space的notification的buffer有多大。感兴趣的读者可以看看这个示例程序来了解如何使用这些系统调用 https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/tree/samples/watch_queue/watch_test.c?h=fsinfo-core

fsinfo()则是一个此前就提出来过的一个系统调用。它的原型都没有变:

    int fsinfo(int dirfd, const char *path, const struct fsinfo_params *params,
	       void *buffer, size_t buf_size);

参数也没有变过,dirfd和path是用来指定要索取信息的文件系统的。这里没有flags参数了,而是藏在params这个结构中,详情如下:

    struct fsinfo_params {
	__u32	at_flags;
	__u32	flags;
	__u32	request;
	__u32	Nth;
	__u32	Mth;
	__u64	__reserved[3];
    };

这里的at_flags放的就是人们通常在openat()这类系统调用中常用的flags参数。request则指定它在索取什么样的信息,从这个patch里面可以看到它可能的取值范围。可能可以提供的信息(这里说“可能”,是因为有些文件系统其实并没有提供这些信息)包括filesystem limits,timestamp resolution information, volume(卷) UUID, 具体连接到的远程系统的服务器是哪个,等等等等。有些属性可以取多个值,就可以用Nth和Mth这两项来指定是哪个。返回信息的格式其实挺复杂的,数值都是写在上面提供的buffer里的,格式则有好多种可能,取决于申请的目标信息。有些情况下,会返回一个structure,其他一些情况则会返回string或者一个名为“opaque”的类型。patch里面有一些介绍,不过很显然使用这个系统调用的人可能需要自己深入钻研一下,具体返回给他们的数据是什么格式。

这组patch set已经是第17版了,已经演化很久了。目前针对这组patch的唯一评论是来自James Bottomley的,他认为这个fsinfo()系统调用是不是其实并不需要。而是应该修改一下fsconfig()(这是用来配置filesystem attribute的API)的实现方式,能让它变成一个可以set attribute也可以read attribute的接口。目前来说,Howells还没回复。

这组patch已经走到第17版了,这已经能说明很多东西了。大家都赞同,有时候确实需要能从kernel获取一些信息出来,不过这个API还是有点太复杂了,用户比较难于理解。不知道最终是否能够既实现这些功能又能解决这个问题。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

Android O Notification之通知休眠流程 一句话总结 在SystemUI进程中通过INotificationManager将要休眠的通知传递给SystemServer进程,SystemServer进程中通过AlarmManager定时发送一条广播让NotificationManagerService发送通知。 1.SystemUI进程中处理点击事件 点击通知休眠按钮,由NotificationSnooze的handleClose... 阅读详情

相关推荐

碳化硅外延层厚度测量:红外干涉光谱与FFT技术详解

薄膜厚度测量是半导体制造中的关键工艺控制环节,其核心原理基于光的干涉现象。当光在薄膜上下界面反射并叠加时,会产生与厚度相关的干涉条纹。通过分析这些条纹,可以非接触、无损地获取薄膜的精确厚度信息。这项技术的核心价值在于实现了对关键工艺参数的在线、快速监控,对于提升器件性能与生产良率至关重要。在第三代半导体,尤其是碳化硅功率器件的制造中,外延层厚度直接决定了器件的击穿电压和导通电阻等核心性能。红外干涉光谱法因其对碳化硅材料在红外波段的良好透过性,成为该领域主流的厚度测量方案。通过快速傅里叶变换(FFT)对采集到

weixin_29032489的博客 308

SELinux策略语法以及示例策略

type a;#定义一个类型 atype a_t;#定义一个类型 a_t#定义一个属性 TestFile#定义一个类型 b_t,具有属性 TestFile#使a_t也具有TestFile属性type 和 attribute 两者位于同一个命名空间,也就是说如果定义了 type a,那就不能定义 attribute aa_t,后面有个 t 是表示 “type” 类型,这是 PC 端 SELinux 策略常见写法,但是 Android 不这样用,没有后缀。

weixin_46645613的博客 1779

详解从无人机倾斜实景三维建模→模型修复→成果网络发布展示分享全流程

1、倾斜实景三维建模软件:CC(Smart3D)软件2、实景三维模型网页在线发布展示、分享平台:图新地球网页端(Wish3D·Earth平台)图新地球网页端(Wish3D·Earth平台)是基于 WebGL技术研发的国产实景三维模型Web端发布展示平台,可实现TB级倾斜实景三维数据快速加载,支持多种格式的三维模型,如OSGB实景模型、OBJ人工模型、SKP人工模型、RVT格式BIM模型等,同时支持模型单体化、三维模型测量分析、水面特效、日照分析等特殊效果呈现,此外也可以根据您的需要进行本地化部署级功能定制。

GISWorld3D的博客 4375

解决页面加载时,watch和mounted声明周期钩子冲突,先后各执行一次

解决页面加载时,watch和mounted声明周期钩子冲突,先后各执行一次,解决页面加载执行两次方法

lebron25的博客 1300

FPGA实战:手把手教你用Verilog实现Modbus CRC16校验(附完整代码)

本文详细介绍了在FPGA中实现Modbus RTU协议CRC16校验模块的完整实战方案。针对硬件设计中的时序、资源与性能挑战,文章从算法原理出发,提供了清晰的Verilog模块接口、状态机设计、查表ROM实现及优化策略,并附带了完整的可综合代码与测试平台,帮助工程师高效构建稳定可靠的工业通信系统。

weixin_29164185的博客 432

pnpm 卸载教程:彻底移除 pnpm 及全局缓存的方法

卸载 pnpm = 全局包 → CLI → 环境变量 → store 缓存只要按这个顺序来,基本不会留下任何坑。如果你后面还打算重新安装 pnpm / 切换 npm、yarn / 多包管理器共存,这些细节反而更重要,环境一旦干净,后续问题会少很多。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 924

[漏洞分析] CVE-2022-0995 watch_queue 1bit “溢出“内核提权

CVE-2022-0995 内核提权漏洞原理分析和利用手法分析

Breeze的博客 1万+

基于Java+SpringBoot+微信小程序实现奶茶点单系统

再不用担心逢年过节的第一杯奶茶有没有人送了,制作一个奶茶点单系统自己当店主,开怀畅饮,一劳永逸。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

linux 热加载 socket,在 Linux 上实现基于 Socket 的多进程实时通信

套接口(Socket)为目前Linux上最为广泛使用的一种的进程间通信机制,与其他的Linux通信机制不同之处在于除了它可用于单机内的进程间通信以外,还可用于不同机器之间的进程间通信。但是由于Socket本身不支持同时等待和超时处理,所以它不能直接用来多进程之间的相互实时通信。本文提出一个基于Socket的多进程之间通信的实现方法。原理是建立一个进程专门用来做为通信服务器(server)来中转各个...

weixin_30737027的博客 212

BMP390L数字大气压传感器原理图设计,已量产(压力传感器)

在工业设备的室内定位、地下设施监测这类 GPS 信号盲区场景里,气压高度检测的 “靠谱程度” 直接决定了系统的可用性 —— 毕竟谁也不想在地下停车场导航时,设备把 1 楼误判成 3 楼。最近在项目里基于博世 BMP390L 做了硬件电路设计,正好聊聊这款工业级数字气压传感器的硬实力,以及原理图里的那些关键设计细节。

不脱发的程序猿 348

基于混合智能框架的景区边界范围预测与补全系统

摘要 本文提出一种混合智能框架,结合随机森林模型和GIS规则约束,解决景区边界缺失问题。系统基于Python和ArcGIS平台,利用多源地理空间数据训练随机森林分类器预测景区范围,并集成地形、水文、道路等GIS规则进行优化。实验结果表明,该方法能有效预测15000个景区的边界,精度优于单一模型。创新点在于: 1)数据驱动与知识驱动相结合的混合智能范式; 2)面向全国尺度的大规模边界补全; 3)提供完整的Python+ArcGIS实现方案。该系统为景区精细化管理提供了技术支撑,具有实用价值。

huanghm88的专栏 281

【kubevirt】(virt-handler Part 5)virt-handler CmdClient / ContainerDisk / HotplugDisk / NotifyServer /

Part 5: virt-handler CmdClient / ContainerDisk / HotplugDisk / NotifyServer / REST / 辅助模块超深度分析

zhonglinzhang 339

vue2学习笔记2-老规矩,从Hello World开始,了解Vue实例和模板

想要把“Hello,World”放置在页面上,首先需要准备一个HTML的块级元素div,来承接内容。

l_q_l的专栏 1256

任意只读文件漏洞分析

简介 漏洞形成原因: 使用 splice(2) ^5系统调用从一个只读文件向一个管道^6中传输数据时,会使管道用于保存数据的缓冲区共享文件的 page cache。由于 PIPE_BUF_FLAG_CAN_MERGE 标志位的存在,调用 splice(2) 之后再向管道中写入数据时,写入的数据会直接写到文件的 page cache 中。 漏洞危害:低权限用户可利用此漏洞向本没有写权限的文件中写入数据,进而实现提权。 修复方法:根据使用的发行版,关注官方的漏洞通告并升级内核到已修复的版本。 漏洞分析过程 漏洞

kali_Ma的博客 1000

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

watch 和mounted 执行顺序

当watch设置了immediate:true的情况下 watch 先执行,mounted 后执行

hantanxin的专栏 4234

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Vue中关于computed、methods、watch,mounted的区别

computed

qq_39399050的博客 7574

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

vue computed和watch的区别

computed 是一个计算属性(被计算出来的属性就是计算属性),不需要加括号,会根据依赖是否变化来缓存。 展示用户名 //引用的是完整版Vue import Vue from "vue/dist/vue.js"; Vue.config.productionTip = false; new Vue({ data: { user: { email: "wuyouzhen@qq.com", nickname: "Luna", pho.

高先生的猫 1452

vue----常用实例方法--$mount(),$destroy(),$watch(),$forceUpdate()

常用的实例方法: $mount()外部设置el, vue的作用范围 $destroy()手动销毁 $watch()监听 $forceUpdate()强制更新 1.$mount()外部设置el, vue的作用范围 <body> <div id="app"> <h2>{{message}}</h...

weixin_34232617的博客 501

LWN:从kernel向user space发送通知的一个通用方案

点击上方蓝色字关注我们~Generalized events notification and security policiesByJonathan CorbetJu...

Linux News搬运工 1146

watch和mounted的区别

功能区别:watch只要数据变化就执行;mounted是DOM执行完后变化,初始化数据和操作DOM;执行时间区别:watch只要数据变化就执行;mounted是组件挂载到页面后执行的;

weixin_55963134的博客 256

LWN:重新思考fsinfo()

关注了就能看到更多这么棒的文章哦~Rethinking fsinfo()By Jonathan CorbetAugust 21, 2020原文来自:https://lwn.net/Art...

Linux News搬运工 480

Zynq Fatfs文件系统应用笔记

    Zynq Fatfs文件系统应用笔 Hello,panda          笔记介绍基于所描述的Zynq Fatfs基于Xilinx xilffsv3.0和Sdpsv2.4,文件系统采用在Bare-Metal和轻量级操作系统中常用的FatFs,版本为v0.10b。 在开始介绍FatFs文件系统在Zynq实现之前一定要先对FAT32文件系统有一个清晰的了解。 1 FAT32文件...

haoxingheng的专栏 9267

watch 监听对象几种方式

1.监听下拉窗数据 templat创建输入框 <el-form-item :label="$t('orderCen.common.operatorSign')" prop="operator" > ...

wh710107079的博客 8882

进程IPC-管道pipe

pipe-> pipe函数原型: #include <unistd.h> int pipe(int file_descriptor[2]);//建立管道,该函数在数组上填上两个新的文件描述符后返回0,失败返回-1。 eg.int fd[2] int result = pipe(fd); pipe-> sys_pipe-> ------------------------------------------- E:\整理分类\源...

u010843408的专栏 1025

vue中 computed 与 watch 、 created 与 mounted 彼此的关联与顺序

watch 与 computed 的区别,最关键的是watch需要监听值的变化而改变,但是computed从一开始就可以达到和某个值关联起来。

Kuroko's Development Notes 1万+

利用vue中 computed 与 watch 、 created 与 mounted 彼此的关联与顺序完美解决watch多级耦合监听与mounted再次赋值的逻辑执行

<template> <div> <p> {{ firstNum }} </p> <p> {{ secondNum }} </p> <p> {{ thirdNum }} </p> </div> </template> <script> export default { computed: { .

beichen3997的博客 3924
上一篇: LWN:用DAMON来优化memory-management!
下一篇: LWN:CAP_PERFMON,有一个新增的capability!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值