ディレクトリが inotify でマウントされたことを検出するにはどうすればよいですか?
質問
Linux Inotify を使用してプログラム上の FS イベントを検出しています。
デバイスが監視対象のディレクトリにマウントされたときに通知を受け取るにはどうすればよいですか?
解決
あなたにはそれができないと思います inotify
. 。ただし、方法は次のとおりです。
- 読む カーネルからの uevents を介して ネットリンク ソケットに接続し、該当するものをフィルタリングして除外します。
"ACTION"
ではありません"mount"
. - 読み取りと解析
"/proc/mounts"
でイベントを取得したとき"mount"
アクション。 - マウントされたばかりのデバイスを含むマウント ポイントのレコードを検索し、それが監視しているディレクトリでない場合はフィルターで除外します。
他のヒント
編集: 更新が廃止されてから 5 年以内になるようにする
最も古いシステム以外を使用している場合は、 リブデフ それが最初のステップとして必要なものです。
この 10 年代の作品を使用している場合は、 udisk これもすべてあなたのために行います。あなたは見る必要があります org.Freedesktop.DBus.ObjectManager インターフェースオン /org/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) manページのあなたは「ドンと言いますtは本当にこのファイルをinotifyを使用する必要があり、それがポーリング可能です。
カーネルバージョン2.6.15以降、この 読書のためのファイルを開いた後、変更:ファイルがポーリング可能です このファイル内の(すなわち、ファイルシステムがマウントまたはアンマウント)を引き起こします 読み込み可能なファイル記述子をマークする(2)を選択し、世論調査(2) そしてイベントがepoll_wait(2)エラー状態を有するものとしてファイルをマークします。
inotifyのは、/ etc / mtabの上に動作していない理由を不思議に思ったし、このマニュアルページを発見された。
あなたが気にしない場合は、の多くは、の、あなたはclose_nowrite
上/etc/fstab
を監視することができるかもしれません。 。など/etc/mtab
、/proc/mounts
を見ることは私のために動作しません。
のみアンマウントについて説明しますinotifyを、そしてueventsはもはやマウント/アンマウントについて説明します。
行う方法は、/ 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の終わりの周りに安定しました(または多分ビット以前)。