【发布时间】:2013-04-04 08:48:00
【问题描述】:
我想监控我系统上的 USB 密钥。我知道它们总是挂载在 /media 中,所以我使用 inotify 来监控 /media。一些 USB 密钥在插入时会创建一个文件夹(例如 sda),该文件夹会一直保留到它们被拔出,有些则创建一个文件夹(例如 sda),立即删除它并创建一个新文件夹(例如 sda1)。这是由于键上的分区。
但是,有时 inotify 仅捕获创建和删除第一个文件夹的事件,而错过了第二个文件夹的创建。当我手动检查 /media 时,第二个文件夹存在,但从未被 inotify 通知。
这种情况很少发生,当它发生时,它总是在设备重启后的第一个插头处。
#include <sys/inotify.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
/* size of the event structure, not counting name */
#define EVENT_SIZE (sizeof (struct inotify_event))
/* reasonable guess as to size of 32 events */
#define BUF_LEN (32 * (EVENT_SIZE + 16))
int main(int argc, char **argv) {
int fd,wd,len,i;
char buf[BUF_LEN];
struct inotify_event *event;
fd_set watch_set;
fd = inotify_init();
if (fd < 0) {
perror("init failed");
exit(EXIT_FAILURE);
}
wd = inotify_add_watch(fd,"/media",IN_ALL_EVENTS);
if (wd < 0) {
perror("add watch failed");
exit(EXIT_FAILURE);
}
/* put the file descriptor to the watch list for select() */
FD_ZERO(&watch_set);
FD_SET(fd,&watch_set);
while(1) {
select(fd+1,&watch_set,NULL,NULL,NULL);
len = read(fd,buf,BUF_LEN);
i=0;
while(i < len) {
event = (struct inotify_event *) &buf[i];
if ((event->mask & IN_CREATE) != 0) {
printf ("%s created\n",event->name);
}
else if ((event->mask & IN_DELETE) != 0) {
printf ("%s deleted\n",event->name);
}
else {
printf ("wd=%d mask=0x%X cookie=%u len=%u name=%s\n",
event->wd, event->mask,
event->cookie, event->len, event->name);
}
i += EVENT_SIZE + event->len;
}
}
}
有什么想法吗?
【问题讨论】:
-
是否可以删除与stackoverflow.com/questions/15350369/how-to-use-inotify-in-c 相关的
/media并创建一个新的/media而没有为其创建新的inotify_add_watch? -
只创建和删除 /media 的子文件夹。虽然错过了一个事件,但下一个事件又被抓住了。所以手表还在运行。