我正在使用 Linux Inotify 来检测程序上的 FS 事件。
当设备挂载到受监控的目录时如何通知我?
我不认为你可以做到这一点inotify
。这是方法:
"ACTION"
"mount"
"/proc/mounts"
当您收到带有操作的事件时读取并解析"mount"
。编辑:更新不到 5 年过时
如果您使用的不是最古老的系统,那么libudev就是您想要的第一步。
如果您使用这十年的某些东西,udisks也会为您完成所有这些工作。您需要查看/org/freedesktop/UDisks2上的org.Freedesktop.DBus.ObjectManager界面以查看新文件系统何时出现。
在现代 Linux 系统上,/etc/mtab 通常指向 /proc/self/mounts:
$ ls -l /etc/mtab
lrwxrwxrwx 1 root root 12 Sep 5 2013 /etc/mtab -> /proc/mounts
$ ls -l /proc/mounts
lrwxrwxrwx 1 root root 11 Jul 10 14:56 /proc/mounts -> self/mounts
proc(5)手册页说你真的不需要为这个文件使用 inotify,它是可轮询的:
从内核版本 2.6.15 开始,此文件是可轮询的:打开文件进行读取后,此文件的更改(即文件系统挂载或卸载)会导致 select(2) 将文件描述符标记为可读,并且 poll(2 ) 和 epoll_wait(2) 将文件标记为有错误条件。
想知道为什么 inotify 不能在 /etc/mtab 上工作并找到这个手册页。
inotify 只告诉您有关卸载的信息,而 uevents 不再告诉您有关安装/卸载的信息。
这样做的方法是在 /proc/mounts 上进行轮询,读取内容,并跟踪您看到的挂载,然后在轮询唤醒时重新解析。当任何文件系统被挂载或卸载时,轮询将在 ERR/PRI 上唤醒。
#include <fcntl.h>
#include <errno.h>
#include <poll.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int fd;
struct pollfd ev;
int ret;
ssize_t bytesread;
char buf[8192];
fd = open("/proc/mounts", O_RDONLY);
printf("########################################\n");
while ((bytesread = read(fd, buf, sizeof(buf))) > 0)
write(1, buf, bytesread);
do {
ev.events = POLLERR | POLLPRI;
ev.fd = fd;
ev.revents = 0;
ret = poll(&ev, 1, -1);
lseek(fd, 0, SEEK_SET);
if (ev.revents & POLLERR) {
printf("########################################\n");
while ((bytesread = read(fd, buf, sizeof(buf))) > 0)
write(1, buf, bytesread);
}
} while (ret >= 0);
close(fd);
return 0;
}
上面的代码只是在启动时打印出挂载点,然后在任何挂载/卸载时打印出来。您可以“区分”它们以找出添加/删除的内容。
请注意,所有这些技术在过去的 Linux 版本中都不稳定和/或损坏。在 Linux 2.6.35 结束时(或者更早一点),这一切都变得稳定了。
如果您不介意大量误报,则可以close_nowrite
在/etc/fstab
. . 看/etc/mtab
,/proc/mounts
等对我不起作用。