INOTIFY(7) | Linux Programmer's Manual | INOTIFY(7) |
名前
inotify -ファイルシステムイベントを監視する説明
inotify API はファイルシステムイベントを監視するための機構を提供する。 inotify は個々のファイルやディレクトリを監視するのに使える。ディレクトリを監視する場合、inotify はディレクトリ自身とディレクトリ内のファイルのイベントを返す。
struct inotify_event {
int wd; /* 監視対象ディスクリプタ */
uint32_t mask; /* イベントのマスク */
uint32_t cookie; /* 関連するイベント群を関連づける
一意なクッキー (rename(2) 用) */
uint32_t len; /* 'name'フィールドのサイズ */
char name[]; /* NULL で終端された任意の名前 */
};
wd はイベント発生の監視対象を指定する。これは、前もって行われた inotify_add_watch(2) 呼び出しで返された監視対象ディスクリプタのうちの 1 つである。
mask には発生したイベント (下記参照) を記述するためのビットが含まれる。
cookie は関連するイベントを関連づけるための一意な整数である。現在のところ、この値は rename イベントに対してのみ使われており、結果のペアである IN_MOVED_FROM と IN_MOVED_TO イベントをアプリケーションで関連づけることができる。他のイベント種別の場合には、 cookie は 0 に設定する。
name フィールドは監視しているディレクトリ内のファイルに対してイベントが返される場合のためにだけ存在する。監視するディレクトリからのファイルの相対パス名を表す。このパス名は NULL で終端され、その後の読み込みで適切なアドレス境界に調整するために、さらに NULL バイトが含まれる場合もある。
len フィールドは NULL バイトを含む name の全てのバイト数を表す。よって、 inotify_event 構造体のサイズは sizeof(struct inotify_event)+len である。
read(2) に渡されたバッファが小さすぎて次のイベントに関する情報を返せない場合の動作はカーネルのバージョンにより異なる。 2.6.21 より前のカーネルでは、 read(2) は 0 を返す。 2.6.21 以降のカーネルでは、 read(2) はエラー EINVAL で失敗する。バッファサイズとして
sizeof(struct inotify_event) + NAME_MAX + 1
を指定すれば、少なくとも 1 イベントで読み出しを行うには十分である。
inotify イベント
inotify_add_watch(2) の mask 引き数と、inotify ファイル構造体を read(2) したときに返される inotify_event 構造体の mask フィールドは、ともに inotify イベントを識別するためのビットマスクである。以下のビットが inotify_add_watch(2) を呼ぶときの mask に指定可能であり、 read(2) で返される mask フィールドで返される:- IN_ACCESS
- ファイルがアクセス (read) された。(*)
- IN_ATTRIB
- メタデータが変更された。メタデータとは、例えば、許可 (permission)、タイムスタンプ、拡張属性、リンクカウント (Linux 2.6.25 以降)、UID、GID などである。(*)
- IN_CLOSE_WRITE
- 書き込みのためにオープンされたファイルがクローズされた。(*)
- IN_CLOSE_NOWRITE
- 書き込み以外のためにオープンされたファイルがクローズされた。(*)
- IN_CREATE
- 監視対象ディレクトリ内でファイルやディレクトリが作成された。(*)
- IN_DELETE
- 監視対象ディレクトリ内でファイルやディレクトリが削除された。(*)
- IN_DELETE_SELF
- 監視対象のディレクトリまたはファイル自身が削除された。
- IN_MODIFY
- ファイルが修正された。(*)
- IN_MOVE_SELF
- 監視対象のディレクトリまたはファイル自身が移動された。
- IN_MOVED_FROM
- ファイルが監視対象ディレクトリ外へ移動された。(*)
- IN_MOVED_TO
- ファイルが監視対象ディレクトリ内へ移動された。(*)
- IN_OPEN
- ファイルがオープンされた。(*)
ディレクトリを監視する場合、上記でアスタリスク (*) を付けたイベントは、そのディレクトリ内のファイルに対して発生する。このとき inotify_event 構造体で返される name フィールドは、ディレクトリ内のファイル名を表す。
IN_ALL_EVENTS マクロは上記のイベント全てのマスクとして定義される。このマクロは inotify_add_watch(2) を呼び出すときの mask 引き数として使える。
さらに 2 つの便利なマクロがある。 IN_MOVE は IN_MOVED_FROM|IN_MOVED_TO と同じで、 IN_CLOSE は IN_CLOSE_WRITE|IN_CLOSE_NOWRITE と同じである。
その他にも以下のビットを inotify_add_watch(2) を呼ぶときの mask に指定できる:
- IN_DONT_FOLLOW
- pathname がシンボリックリンクである場合に辿らない。 (Linux 2.6.15 以降)
- IN_EXCL_UNLINK (Linux 2.6.36 以降)
- デフォルトでは、あるディレクトリの子ファイルに関するイベントを監視 (watch) した際、ディレクトリからその子ファイルが削除 (unlink) された場合であってもその子ファイルに対してイベントが生成される。このことは、アプリケーションによってはあまり興味のないイベントが大量に発生することにつながる (例えば、 /tmp を監視している場合、たくさんのアプリケーションが、すぐにその名前が削除される一時ファイルをそのディレクトリに作成する)。 IN_EXCL_UNLINK を指定するとこのデフォルトの動作を変更でき、監視対象のディレクトリから子ファイルが削除された後に子ファイルに関するイベントが生成されなくなる。
- IN_MASK_ADD
- pathname に対する監視マスクが既に存在する場合、 (マスクの置き換えではなく) イベントを追加 (OR) する。
- IN_ONESHOT
- 1 つのイベントについて pathname を監視し、イベントが発生したら監視対象リストから削除する。
- IN_ONLYDIR (Linux 2.6.15 以降)
- pathname がディレクトリの場合にのみ監視する。
以下のビットが read(2) で返される mask フィールドに設定される:
- IN_IGNORED
- 監視対象が ( inotify_rm_watch(2) により) 明示的に削除された。もしくは (ファイルの削除、またはファイルシステムのアンマウントにより) 自動的に削除された。
- IN_ISDIR
- このイベントの対象がディレクトリである。
- IN_Q_OVERFLOW
- イベントキューが溢れた (このイベントの場合、 wd は-1 である)。
- IN_UNMOUNT
- 監視対象オブジェクトを含むファイルシステムがアンマウントされた。
/proc インターフェース
以下のインターフェースは、inotify で消費されるカーネルメモリの総量を制限するのに使用できる:- /proc/sys/fs/inotify/max_queued_events
- このファイルの値は、アプリケーションが inotify_init(2) を呼び出すときに使用され、対応する inotify インスタンスについてキューに入れられるイベントの数の上限を設定する。この制限を超えたイベントは破棄されるが、 IN_Q_OVERFLOW イベントが常に生成される。
- /proc/sys/fs/inotify/max_user_instances
- 1 つの実ユーザ ID に対して生成できる inotify インスタンスの数の上限を指定する。
- /proc/sys/fs/inotify/max_user_watches
- 作成可能な監視対象の数の実 UID 単位の上限を指定する。
バージョン
inotify は 2.6.13 の Linux カーネルに組込まれた。これに必要なライブラリのインターフェースは、 glibc のバージョン 2.4 に追加された ( IN_DONT_FOLLOW, IN_MASK_ADD, IN_ONLYDIR はバージョン 2.5 で追加された)。準拠
inotify API は Linux 独自のものである。注意
inotify ファイルディスクリプタは select(2), poll(2), epoll(7) を使って監視できる。イベントがある場合、ファイルディスクリプタは読み込み可能と通知する。制限と警告
inotify によるディレクトリの監視は再帰的に行われない: あるディレクトリ以下のサブディレクトリを監視する場合、監視対象を追加で作成しなければならない。大きなディレクトリツリーの場合には、この作業にかなり時間がかかることがある。バグ
2.6.16 以前のカーネルでは IN_ONESHOT mask フラグが働かない。関連項目
inotify_add_watch(2), inotify_init(2), inotify_init1(2), inotify_rm_watch(2), read(2), stat(2)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2013-02-25 | Linux |