디렉토리에 Inotify가 장착 될 때 어떻게 감지 할 수 있습니까?
문제
Linux Inotify를 사용하여 프로그램에서 FS 이벤트를 감지하고 있습니다.
모니터링 된 디렉토리에 장치가 장착 될 때 어떻게 알 수 있습니까?
해결책
나는 당신이 그것을 할 수 있다고 생각하지 않습니다 inotify
. 그래도 방법은 다음과 같습니다.
- 읽다 커널의 uevents a 넷 링크 소켓과 어디에 있는지 필터링하십시오
"ACTION"
아니다"mount"
. - 읽고 구문 분석하십시오
"/proc/mounts"
a"mount"
동작. - 방금 장착 된 장치로 마운트 포인트에 대한 레코드를 찾아보고있는 디렉토리가 아닌 경우 필터링하십시오.
다른 팁
편집하다: 업데이트는 5 년 미만으로 더 이상 사용되지 않습니다
당신이 가장 오래된 시스템을 제외하고 있다면 libudev 첫 번째 단계에서 원하는 것입니다.
이 10 년 동안 무언가를하고 있다면 udisks 당신을 위해이 모든 것을 할 것입니다. 당신은 그것을 볼 필요가 있습니다 org.freedesktop.dbus.objectmanager 인터페이스 켜기 /org/freedesktop/udisks2 새로운시기를 볼 수 있습니다 파일 시스템 일어나십시오.
최신 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 이므로이 파일은 폴링 가능합니다. 읽기 파일을 열면이 파일의 변경 (예 : 파일 시스템 마운트 또는 마운트를 마운트하지 않음)으로 인해 파일 디스크립터를 읽을 수 있고 설문 조사 (2)로 표시합니다 (2). ) 및 epoll_wait (2) 파일을 오류 조건으로 표시합니다.
왜 Inotify가 /etc /mtab에서 작동하지 않는지 궁금해 하고이 인공을 발견했습니다.
당신이 마음에 들지 않는다면 많이 잘못된 경보, 당신은 close_nowrite
~에 /etc/fstab
. . 보고있다 /etc/mtab
, /proc/mounts
, 등은 나를 위해 작동하지 않습니다.
inotify는 미혼에 대해서만 알려주고, Uevents는 더 이상 Mount/Unmount에 대해 알려주지 않습니다.
해야 할 방법은 /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;
}
위의 코드는 시작시 마운트 포인트를 인쇄 한 다음 모든 마운트/마운트에 인쇄합니다. 추가/제거 된 내용을 찾기 위해 "Diff"하는 것은 당신에게 달려 있습니다.
이러한 모든 기술은 과거의 Linux 버전에서 불안정하고/또는 파손되었습니다. Linux 2.6.35의 끝에서 모두 안정되었습니다 (또는 아마도 조금 일찍).