我使用Linux的inotify来检测我的程序FS事件。
怎么能当设备被安装在受监控的目录通知我?
我使用Linux的inotify来检测我的程序FS事件。
怎么能当设备被安装在受监控的目录通知我?
我不认为你可以做到这一点inotify
。 下面是尽管方法:
"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(或者更早一点)的时候买的稳定。