プログラムで FS イベントを検出するために Linux Inotify を使用しています。
監視対象のディレクトリにデバイスがマウントされたときに通知を受け取るにはどうすればよいですか?
ではできないと思いますinotify
。ただし、方法は次のとおりです。
"ACTION"
"mount"
"/proc/mounts"
アクションでイベントを取得したときに読み取りと解析を行い"mount"
ます。編集:廃止されてから 5 年未満になるように更新する
最も古いシステム以外を使用している場合は、最初のステップとしてlibudevが必要です。
この 10 年間の何かを使用している場合は、udisksがこれらすべてを実行してくれます。/org/freedesktop/UDisks2のorg.Freedesktop.DBus.ObjectManagerインターフェイスを監視して、新しいファイルシステムがいつ起動するかを確認する必要があります。
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 の終わり頃 (またはそれより少し前) にすべてが安定しました。
多くの誤報が気にならない場合は、 close_nowrite
onを監視できる可能性があります/etc/fstab
。. /etc/mtab
、などを見てもうまくいき/proc/mounts
ません。