문제

Linux Inotify를 사용하여 프로그램에서 FS 이벤트를 감지하고 있습니다.

모니터링 된 디렉토리에 장치가 장착 될 때 어떻게 알 수 있습니까?

도움이 되었습니까?

해결책

나는 당신이 그것을 할 수 있다고 생각하지 않습니다 inotify. 그래도 방법은 다음과 같습니다.

  1. 읽다 커널의 uevents a 넷 링크 소켓과 어디에 있는지 필터링하십시오 "ACTION" 아니다 "mount".
  2. 읽고 구문 분석하십시오 "/proc/mounts" a "mount" 동작.
  3. 방금 장착 된 장치로 마운트 포인트에 대한 레코드를 찾아보고있는 디렉토리가 아닌 경우 필터링하십시오.

다른 팁

편집하다: 업데이트는 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의 끝에서 모두 안정되었습니다 (또는 아마도 조금 일찍).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top