发现 /proc/mounts 的“真实”大小

Posted

技术标签:

【中文标题】发现 /proc/mounts 的“真实”大小【英文标题】:Discover "true" size of /proc/mounts 【发布时间】:2019-09-18 15:50:21 【问题描述】:

目前,我可以使用 poll 和 revents POLLERR | POLLPRI 确定 /proc/mounts 何时更改。我现在希望能够比较这个伪文件在更改前后的大小,以确定是附加了新的挂载,还是移除了旧的挂载。

我尝试使用ioctl(fd, FIONREAD, &size),但它似乎报告了无意义的大小。我不希望必须缓冲整个输出,因为我必须分配一个不可移植的相当大的缓冲区。

我正在编写一个 C/C++ 应用程序,它可以监听和响应挂载点的变化。更具体地说,当 USB 大容量存储设备连接到系统时,我希望我的程序能够:

    确定已安装新分区。 检查该分区的内容。 如果分区包含具有特定名称的文件,请对该文件执行某些操作。

我认为我目前的方法不合适。

【问题讨论】:

我认为您最安全的做法是在每次轮询唤醒时重新扫描所有文件系统。可能是,/dev/sdd 很快被卸载、断开连接,附加了一个新驱动器,该驱动器也分配给了/dev/sdd,并且它被安装在同一目录中,直到你的进程没有被唤醒毕竟这一切都发生了。那么/proc/mounts 可能看起来完全一样,但可能新安装的设备确实包含您的魔法文件。 【参考方案1】:

可以想象,挂载已更改,但/proc/mounts 文件大小保持不变。文件大小不是文件内容的可靠摘要。

我不想缓冲整个输出,因为我必须分配一个不可移植的相当大的缓冲区。

逐个字符或逐行读取文件并对所有字符进行散列(文件内容的散列)。将当前的哈希值与之前的哈希值进行比较,判断文件内容是否发生变化。


您的应用程序可以解析/proc/mounts/proc/self/mountinfo,构建一个排序的挂载列表(例如挂载点和主要-次要)并保留它。当/proc/mounts 更新时,再次解析并构建一个新的排序列表,将其与保留的列表进行比较以确定安装添加/删除,对添加/删除进行操作,用新列表替换保留列表。

【讨论】:

当然,如果你真的想知道what变了,不只是something变了,我觉得没有实际存储以前的内容(或至少是您关心的那些条目)并进行比较的好方法。我不明白什么是不可移植的。 好的,所以这似乎不是要走的路。在 Linux 系统上对挂载 C 中的更改做出反应的正确方法是什么? @BenjaminCrawfordCtrl-Alt-Tut:也许你应该更全面地解释一下你正在关注哪些变化,为什么,以及当事情发生变化时你想做什么。目前这听起来很像 XY 问题。 @BenjaminCrawfordCtrl-Alt-Tut:另外,您知道getmntent,它是解析/proc/mounts 的更便携的替代方案吗? @BenjaminCrawfordCtrl-Alt-Tut Waiting for changes on /proc/mounts with select/poll/epoll_wait 是明确定义的。你可以解析/proc/self/mountinfo而不是/proc/mounts,前者是scanf友好的。

以上是关于发现 /proc/mounts 的“真实”大小的主要内容,如果未能解决你的问题,请参考以下文章

linux下插入U盘自动挂载后,用C获取其挂载点(cat /proc/mounts)

Linux中/etc/fstab /etc/mtab /proc/mounts这三个文件的分析与比较 分区表位置

adb 删除文件时提示Read-only file system问题not in /proc/mounts

android设备/proc目录下都有什么?

怎么查看文件真实大小?

jquery获取图片的真实大小