发现 /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这三个文件的分析与比较 分区表位置