Linux 中如何获取内存修改通知

2024-05-05

在Linux的用户空间程序中,我通过从堆中分配来获取一块内存,然后将指针分发给在其他线程中运行的许多其他组件来使用。当上述内存被修改时我想收到通知。我当然可以开发一个自定义用户空间解决方案,供其他组件在尝试修改内存时使用。我的情况的问题是这些是遗留组件,它们可以在很多情况下写入内存。所以我想知道是否有类似的 API,如 inotify(文件更改时收到通知)或其他方法,以便在一块内存更改时收到通知。

我考虑过使用 mmap 和 inotify,如果不刷新更改,这显然不起作用。任何建议表示赞赏:-)


You CAN add an inotify手表 http://linux.die.net/man/7/inotify这将触发msync() http://linux.die.net/man/2/msync在 mmap-ed 文件上。

这需要给 Linux 内核打补丁启用对新 inotify 手表的支持 https://gist.github.com/TheCodeArtist/5874669。该补丁添加了一个新标志IN_SYNC- 每当对 mmap 文件执行 msync() 时都会触发一个新的 inotify 事件。

补丁已在 Linux 内核 v2.6.37 上进行了测试。

From 83edf446e92c86c738337ca4a35eab48e2f4e0eb Mon Sep 17 00:00:00 2001
From: Chinmay V S <[email protected] /cdn-cgi/l/email-protection>
Date: Mon, 17 Jun 2013 13:53:57 +0800
Subject: [PATCH] Add mmap-ed file support to inotify

This patch adds a new flag IN_SYNC. This is a new inotify event that is
triggered whenever msync() is carried out on a mmap-ed file.

Signed-off-by: Chinmay V S <[email protected] /cdn-cgi/l/email-protection>
---
 fs/sync.c                             |  5 +++++
 include/linux/fsnotify.h              | 16 ++++++++++++++++
 include/linux/fsnotify_backend.h      |  1 +
 include/linux/inotify.h               |  3 ++-
 mm/msync.c                            |  4 ++++
 5 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/fs/sync.c b/fs/sync.c
index ba76b96..174c2af 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -16,6 +16,7 @@
 #include <linux/buffer_head.h>
 #include <linux/backing-dev.h>
 #include "internal.h"
+#include <linux/fsnotify.h>

 #define VALID_FLAGS (SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE| \
            SYNC_FILE_RANGE_WAIT_AFTER)
@@ -190,6 +191,10 @@ static int do_fsync(unsigned int fd, int datasync)
        ret = vfs_fsync(file, datasync);
        fput(file);
    }
+
+   if (!ret)
+       fsnotify_sync(file->f_path.dentry);
+
    return ret;
 }

diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h
index b10bcde..ef211fb 100644
--- a/include/linux/fsnotify.h
+++ b/include/linux/fsnotify.h
@@ -224,6 +224,22 @@ static inline void fsnotify_modify(struct file *file)
 }

 /*
+ * fsnotify_sync - file was synced
+ */
+static inline void fsnotify_sync(struct dentry *dentry)
+{
+   struct inode *inode = dentry->d_inode;
+   u32 mask = FS_SYNC;
+
+   if (S_ISDIR(inode->i_mode))
+       mask |= FS_ISDIR;
+
+   fsnotify_parent(NULL, dentry, mask);
+   fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0);
+
+}
+
+/*
  * fsnotify_open - file was opened
  */
 static inline void fsnotify_open(struct file *file)
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h
index 7380763..35b5cb8 100644
--- a/include/linux/fsnotify_backend.h
+++ b/include/linux/fsnotify_backend.h
@@ -36,6 +36,7 @@
 #define FS_DELETE      0x00000200  /* Subfile was deleted */
 #define FS_DELETE_SELF     0x00000400  /* Self was deleted */
 #define FS_MOVE_SELF       0x00000800  /* Self was moved */
+#define FS_SYNC            0x00001000  /* File was synced */

 #define FS_UNMOUNT     0x00002000  /* inode on umount fs */
 #define FS_Q_OVERFLOW      0x00004000  /* Event queued overflowed */
diff --git a/include/linux/inotify.h b/include/linux/inotify.h
index d33041e..244a132 100644
--- a/include/linux/inotify.h
+++ b/include/linux/inotify.h
@@ -38,6 +38,7 @@ struct inotify_event {
 #define IN_DELETE      0x00000200  /* Subfile was deleted */
 #define IN_DELETE_SELF     0x00000400  /* Self was deleted */
 #define IN_MOVE_SELF       0x00000800  /* Self was moved */
+#define IN_SYNC            0x00001000  /* File was synced */

 /* the following are legal events.  they are sent as needed to any watch */
 #define IN_UNMOUNT     0x00002000  /* Backing fs was unmounted */
@@ -64,7 +65,7 @@ struct inotify_event {
 #define IN_ALL_EVENTS  (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \
             IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \
             IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF | \
-            IN_MOVE_SELF)
+            IN_MOVE_SELF | IN_SYNC)

 /* Flags for sys_inotify_init1.  */
 #define IN_CLOEXEC O_CLOEXEC
diff --git a/mm/msync.c b/mm/msync.c
index 632df45..b1665ac 100644
--- a/mm/msync.c
+++ b/mm/msync.c
@@ -13,6 +13,7 @@
 #include <linux/file.h>
 #include <linux/syscalls.h>
 #include <linux/sched.h>
+#include <linux/fsnotify.h>

 /*
  * MS_SYNC syncs the entire file - including mappings.
@@ -83,6 +84,9 @@ SYSCALL_DEFINE3(msync, unsigned long, start, size_t, len, int, flags)
            get_file(file);
            up_read(&mm->mmap_sem);
            error = vfs_fsync(file, 0);
+               if (!error)
+                   fsnotify_sync(file->f_path.dentry);
+
            fput(file);
            if (error || start >= end)
                goto out;
-- 
1.8.2

补丁已在 Linux 内核 v2.6.37 上进行了测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 中如何获取内存修改通知 的相关文章

  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • Gtk-ERROR **:检测到 GTK+ 2.x 符号

    我正在使用 gcc 编译我的 c 应用程序 并使用以下标志 gcc evis c pkg config cflags libs gtk 2 0 libs clutter gtk 1 0 libs gthread 2 0 Wall o evi
  • 如何在Django中显示内存中的图片?

    我知道如何将图片显示为内存中的页面 如下所示 import cStringIO mStream cStringIO StringIO picBin return HttpResponse mStream getvalue image jpg
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • PAE(物理地址扩展)如何实现大于4GB的地址空间?

    维基百科文章的摘录物理地址扩展 http en wikipedia org wiki Physical Address Extension x86 处理器硬件架构通过用于选择附加内存的附加地址线进行了增强 因此物理地址大小从 32 位增加到
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • Mcrt1.o和Scrt1.o有什么用?

    我坚持使用以下两个文件 即 Mcrt1 o 和 Scrt1 o 谁能帮我知道这两个文件的用途 如何使用它 我们以 gcrt1 o 为例 在使用 pg 选项编译进行性能测试时非常有用 谢谢 表格的文件 crt o总是 C 运行时启动代码 大部
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • 限制 Imagemagick 使用的空间和内存

    我在 Rails 应用程序上使用 Imagemagick 使用 rmagick 但我的服务器 Ubuntu 不是很大 当我启动转换进程时 Imagemagick 占据了我的服务器 30GB HDD 的所有位置 内存 我想限制内存和 tmp

随机推荐

  • PyCurl 请求在执行时无限挂起

    我编写了一个脚本来从 Qualys 获取扫描结果 每周运行一次以收集指标 该脚本的第一部分涉及获取过去一周运行的每个扫描的引用列表以进行进一步处理 问题是 虽然有时这会完美地工作 但有时脚本会挂在c perform 线 手动运行脚本时这是可
  • 如何从 MWS 检索亚马逊退货商品

    我尝试获取每个订单的退回商品 但不幸的是 它似乎没有从亚马逊网络服务提供此类信息 public GetOrderResponse InvokeGetOrder Create a request GetOrderRequest request
  • 在 IconPageIndicator 中自定义填充和边距

    我正在尝试实现自定义 IconPageIndicator viewpager 我想自定义 com viewpagerindicator IconPageIndicator 中显示的图标的边距和填充 所以我编写了自定义 IconPageInd
  • 如何用泛型返回类型推断方法的具体返回类型?

    给出以下接口 interface Random extends java util function Supplier
  • 前景色中的 Alpha

    我想在标签控件中创建文本的淡入淡出效果 我更改了标签前景色中的 Alpha 值 但它不受影响 我在这里看到同样的问题 http phorums com au showthread php 190812 Alpha value of the
  • “android.enableUnitTestBinaryResources”已弃用[重复]

    这个问题在这里已经有答案了 我刚刚更新了我的 Android Studio 现在当我构建我的项目时 我收到此错误 选项 android enableUnitTestBinaryResources 已弃用 这 当前默认值为 假 已从当前版本中
  • Kubernetes Pod 中现在几点了?

    假设我有一些 NET Core 代码在 k8s pod 中运行 我要求 DateTime Now 我假设我将从运行 pod 的主机获取日期时间 有没有办法获得在 k8s 集群中一致的日期时间值 容器中的时钟与主机相同 因为它由内核控制 时区
  • WP8 上的 IE 10 忽略媒体查询?

    我正在开发一个使用媒体查询的网站 我可以在桌面浏览器中看到它们正常工作 但是当我在 WP8 设备上导航到该网站时 没有加载 CSS 我创建了一个非常简单的 HTML 页面来复制问题并显示我尝试过但无法正常工作的解决方案 这是完整的代码
  • 全文搜索 DynamoDB

    以下情况 我正在为我的客户将元素存储在 DyanmoDb 中 HashKey 是元素 ID Range Key 是客户 ID 除了这些字段之外 我还存储一个字符串数组 gt 标签 例如 Pets House 和多行文本 我想在我的应用程序中
  • 在 Yii 2.0 中添加 jquery

    如何在 Yii 2 0 中将 jQuery 添加到我的页面 在 Yii 1 x 中你可以使用 Yii app gt clientScript gt registerCoreScript jquery 我已经尝试用自己的 View 类重写并尝
  • 正则表达式奇/偶数

    我有一个正则表达式问题 我不知道该怎么做 它必须匹配开头包含任意数量的 a 的所有字符串 如果 a 的数量为偶数 则匹配单个 0 如果 a 的数量为奇数 则匹配单个 1 如何跟踪偶数 奇数 Sample aaa1 aaaa0 a aa 1
  • 在Python中使用Pandas进行数字到日期的转换?

    当我尝试从数字格式转换为日期时 我没有得到与 Excel 中相同的结果 我需要转换一个Number to 日期格式并得到与 Excel 中相同的结果 例如 在 Excel 中 对于以下数字 我得到以下结果 Input 42970 73819
  • EaselJS:使用线连接 2 个容器/形状

    我希望能够单击一个容器 形状 当我移动鼠标时 会绘制一条可以连接到另一个容器 形状 一端有箭头 的线 理想情况下 我希望这条线捕捉到目标元素 我是 EaselJS 的新手 我不知道如何解决这个问题 这是我在这里遇到的关闭 我无法理解它 使用
  • 数据源和数据集的区别

    我目前正在开发一个项目 其主要任务是读取存储在 SQL 数据库中的数据并以用户友好的形式显示它们 使用的编程语言是C 我在 Borland C Builder 6 环境中工作 但我认为标题中提出的问题与编程语言或库无关 当从数据库读取数据时
  • 像数组一样初始化类对象

    我正在为学校项目创建一个自定义向量类 我希望能够像这样初始化它 vector x 2 3 4 5 C 有什么办法可以做到这一点吗 这是我的班级的标题 class vector private int vsize int valloc dou
  • 'value'之间有什么区别吗?' aria-label='在SQL Server中,not(columnName='value')和columnName<>'value'之间有什么区别吗?'> 在SQL Server中,not(columnName='value')和columnName<>'value'之间有什么区别吗?

    在 SQL Server 的 where 子句中 无论您编写代码有什么区别not columnName value or columnName lt gt value 我正在考虑性能方面的问题 有人告诉我 当使用 Not 时 它可能不会使用
  • 在同一解决方案中处理 C# 和 VB.net 项目

    我在一个c 项目中 在这个项目中我引用 使用项目引用 另一个用vb net编写的类库 现在 当我右键单击并查看类的定义时 它不会带我到 vb net 项目中的确切源代码 而是带我到 vb net 类的动态生成的 C 表示形式 我尝试了相反的
  • 应用程序崩溃 - dyld: 未找到符号: _OBJC_CLASS_$_UITraitCollection

    dyld Symbol not found OBJC CLASS UITraitCollection 代码中我引用 UITraitCollection 的唯一地方是 func loadImages imageName NSString va
  • Visual Studio 的“右键单击”键盘快捷键?

    我试图强迫自己尽可能少地使用鼠标 但我在任何地方都找不到这个简单快捷方式的答案 步骤如下 打开 Visual Studio 打开任何 C 文件 或我认为的任何代码文件 将鼠标指向任意位置 窗口 文件 右键点击 是否有一个快捷键 这样我就不必
  • Linux 中如何获取内存修改通知

    在Linux的用户空间程序中 我通过从堆中分配来获取一块内存 然后将指针分发给在其他线程中运行的许多其他组件来使用 当上述内存被修改时我想收到通知 我当然可以开发一个自定义用户空间解决方案 供其他组件在尝试修改内存时使用 我的情况的问题是这