私は自分のプログラムでFSイベントを検出するためにLinux Inotifyを使用しています。ディレクトリがinotifyでマウントされたときは、どうすれば検出できますか?
デバイスが監視対象のディレクトリにマウントされているときに、どのように通知できますか?
私は自分のプログラムでFSイベントを検出するためにLinux Inotifyを使用しています。ディレクトリがinotifyでマウントされたときは、どうすれば検出できますか?
デバイスが監視対象のディレクトリにマウントされているときに、どのように通知できますか?
inotify
とは思えません。ここでの方法は、しかしです:
"ACTION"
が"mount"
ない場合、それらをフィルタリング。"/proc/mounts"
あなたが"mount"
アクションでイベントを受け取ったとき。EDIT:あなたはシステムの最も古いが、何にもなら Updateは
廃止された5年未満であることを、libudevは、あなたが最初のステップのために何をしたいです。
あなたがこの10年から何かをしているのなら、udisksはこれもすべてあなたのために行います。新しいfilesystemsがいつ登場するかを確認するには、/org/freedesktop/UDisks2のorg.Freedesktop.DBus.ObjectManagerインターフェイスを見る必要があります。
ロットのが虚偽のアラームの場合は、/etc/fstab
にclose_nowrite
を見ることができます。 。見ること/etc/mtab
、/proc/mounts
などは私のためには機能しません。最近の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)manpageはあなたが本当にこのファイルのinotifyを使用する必要はありませんと言っています、それがポーリング可能です:
カーネルのバージョン2.6.15ので、この ファイルがポーリング可能です:読書のためのファイルを開いた後、このファイルの変更 は(つまり、ファイルシステムがマウントまたはアンマウント)原因ファイルディスクリプタを読み取り可能とマークするにはselect(2)を、poll(2) とepoll_wait(2)はファイルにエラー状態をマークします。
なぜinotifyが/ etc/mtabで動作しないのか疑問に思って、このマンページを見つけました。
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の終わり(あるいはそれ以前のバージョン)で安定しています。
代わりに、 '/ etc/mtab'に' inotify'ウォッチを入れ、 '/ proc/mounts'と同じように解析します。しかし、これははるかに壊れやすいです。 –
カーネル内の 'uevent'からの' mount'アクションがあるかどうかはわかりません。それは[壊れたとみなされ、削除された]と思われます(https://lkml.org/lkml/2006/2/22/169)。 –