如何检测目录是否已使用 inotify 挂载?
题
我正在使用 Linux Inotify 来检测程序上的 FS 事件。
当设备安装在受监控的目录上时,如何通知我?
解决方案
我认为你不能这样做 inotify
. 。不过方法如下:
- 读 来自内核的 uevent 通过一个 网联 套接字并过滤掉那些
"ACTION"
不是"mount"
. - 读取并解析
"/proc/mounts"
当您收到一个事件时"mount"
行动。 - 查找刚刚安装的设备的安装点记录,如果不是您正在观看的目录,则将其过滤掉。
其他提示
修改强>更新为少于5年过时
如果您使用的是什么,但最古老的系统,的 libudev 是你想要的第一步。
如果你从这个十年的东西, udisks 会做这一切也适用于你。你需要看 org.Freedesktop.DBus.ObjectManager在 /组织/ freedesktop的接口/ UDisks2 以看到,当新的文件系统转起来。
在现代Linux系统中的/ etc / MTAB经常指向的/ proc /自/坐骑:
$ 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,这 文件是可轮询:打开文件进行读取,更改后 在此文件中(即,一个文件系统装载或卸载)的原因 选择(2)来标记文件描述符为可读,和轮询(2) 和epoll_wait(2)将文件标记为具有错误状况。
当时想,为什么不的inotify的/ etc / mtab中的作品上,并发现了这个手册页。
如果你不介意的大量的,你也许可以观看上close_nowrite
/etc/fstab
。 。看着/etc/mtab
,/proc/mounts
等不适合我的工作。
的inotify只告诉你卸载和热插拔事件不再告诉你挂载/卸载。
做的方式是轮询的/ proc /坐骑,在内容阅读,并跟踪你已经看到了坐骑,而当调查醒来,然后重新分析。轮询会醒来上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年底稳定(或者更早一点)。