2009-07-11 5 views

答えて

9

inotifyとは思えません。ここでの方法は、しかしです:

  1. Netlinkソケット経由uevents from kernelを読み、"ACTION""mount"ない場合、それらをフィルタリング。
  2. Read and parse "/proc/mounts"あなたが"mount"アクションでイベントを受け取ったとき。
  3. マウントされたばかりのマウントポイントのレコードを見つけて、それが見ているディレクトリでない場合は、それをフィルタリングします。
+0

代わりに、 '/ etc/mtab'に' inotify'ウォッチを入れ、 '/ proc/mounts'と同じように解析します。しかし、これははるかに壊れやすいです。 –

+0

カーネル内の 'uevent'からの' mount'アクションがあるかどうかはわかりません。それは[壊れたとみなされ、削除された]と思われます(https://lkml.org/lkml/2006/2/22/169)。 –

4

EDIT:あなたはシステムの最も古いが、何にもなら Updateは

廃止された5年未満であることを、libudevは、あなたが最初のステップのために何をしたいです。

あなたがこの10年から何かをしているのなら、udisksはこれもすべてあなたのために行います。新しいfilesystemsがいつ登場するかを確認するには、/org/freedesktop/UDisks2org.Freedesktop.DBus.ObjectManagerインターフェイスを見る必要があります。

1

ロットのが虚偽のアラームの場合は、/etc/fstabclose_nowriteを見ることができます。 。見ること/etc/mtab/proc/mountsなどは私のためには機能しません。最近のLinuxシステムで

2

の/ 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で動作しないのか疑問に思って、このマンページを見つけました。

1

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の終わり(あるいはそれ以前のバージョン)で安定しています。

関連する問題