9

プログラムで FS イベントを検出するために Linux Inotify を使用しています。

監視対象のディレクトリにデバイスがマウントされたときに通知を受け取るにはどうすればよいですか?

4

5 に答える 5

9

ではできないと思いますinotify。ただし、方法は次のとおりです。

  1. Netlinkソケット経由でカーネルから ueventを読み取り、そうでないものを除外します。"ACTION""mount"
  2. "/proc/mounts"アクションでイベントを取得したときに読み取りと解析を行い"mount"ます。
  3. マウントされたばかりのデバイスを含むマウント ポイントのレコードを検索し、監視しているディレクトリでない場合は除外します。
于 2009-07-11T09:57:28.520 に答える
4

編集:廃止されてから 5 年未満になるように更新する

最も古いシステム以外を使用している場合は、最初のステップとしてlibudevが必要です。

この 10 年間の何かを使用している場合は、udisksがこれらすべてを実行してくれます。/org/freedesktop/UDisks2のorg.Freedesktop.DBus.ObjectManagerインターフェイスを監視して、新しいファイルシステムがいつ起動するかを確認する必要があります。

于 2009-07-16T06:27:28.277 に答える
2

inotify はアンマウントについてのみ通知し、uevents はマウント/アンマウントについて通知しなくなりました。

その方法は、/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;
}

上記のコードは、起動時にマウント ポイントを出力し、マウント/アンマウント時に出力します。それらを「差分」して、何が追加/削除されたかを調べるのはあなた次第です。

これらの手法はすべて、過去の Linux バージョンでは不安定であったり、壊れていたりすることに注意してください。Linux 2.6.35 の終わり頃 (またはそれより少し前) にすべてが安定しました。

于 2016-10-17T20:19:32.197 に答える
1

多くの誤報が気にならない場合は、 close_nowriteonを監視できる可能性があります/etc/fstab。. /etc/mtab、などを見てもうまくいき/proc/mountsません。

于 2012-09-03T12:42:52.623 に答える