OSDN Git Service

Update release pages
[linuxjm/LDP_man-pages.git] / release / man7 / inotify.7
index 00cbf44..263d9cf 100644 (file)
@@ -1,5 +1,6 @@
 .\" t
 .\" Copyright (C) 2006, 2014 Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Copyright (C) 2014 Heinrich Schuchardt <xypron.glpk@gmx.de>
 .\"
 .\" %%%LICENSE_START(VERBATIM)
 .\" Permission is granted to make and distribute verbatim copies of this
@@ -42,7 +43,7 @@
 .\" Updated 2013-07-22, Akihiro MOTOKI <amotoki@gmail.com>
 .\" Updated 2013-08-21, Akihiro MOTOKI <amotoki@gmail.com>, LDP v3.53
 .\"
-.TH INOTIFY 7 2014\-05\-08 Linux "Linux Programmer's Manual"
+.TH INOTIFY 7 2014\-12\-31 Linux "Linux Programmer's Manual"
 .SH 名前
 inotify \- ファイルシステムイベントを監視する
 .SH 説明
@@ -52,35 +53,35 @@ inotify \- ファイルシステムイベントを監視する
 
 この API では以下のシステムコールが使用される。
 .IP * 3
-\fBinotify_init\fP(2)  は inotify インスタンスを作成し、inotify インスタンスを参照する ファイルディスクリプタを返す。
-より新しい \fBinotify_init1\fP(2)  も \fBinotify_init\fP(2)  と同様だが、
+\fBinotify_init\fP(2)  は inotify インスタンスを作成し、inotify インスタンスを参照する
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\82\92è¿\94ã\81\99ã\80\82 ã\82\88ã\82\8aæ\96°ã\81\97ã\81\84 \fBinotify_init1\fP(2)  ã\82\82 \fBinotify_init\fP(2)  ã\81¨å\90\8cæ§\98ã\81 ã\81\8cã\80\81
 こちらにはいくつかの追加の機能を利用するための \fIflags\fP 引き数がある。
 .IP *
 \fBinotify_add_watch\fP(2)  は inotify インスタンスに関連づけられた「監視対象 (watch) リスト」を操作する。
 監視対象リストの各アイテム ("watch") は、 ファイルまたはディレクトリのパス名と、 そのパス名で参照されるファイルに対して
 カーネルが監視する複数のイベントの集合を指定する。 \fBinotify_add_watch\fP(2)
-は新しい監視アイテムの作成や既存の監視対象の変更ができる。 各監視対象は一意の「監視対象ディスクリプタ」を持つ。 これは監視対象を作成したときに
\81¯æ\96°ã\81\97ã\81\84ç\9b£è¦\96ã\82¢ã\82¤ã\83\86ã\83 ã\81®ä½\9cæ\88\90ã\82\84æ\97¢å­\98ã\81®ç\9b£è¦\96対象ã\81®å¤\89æ\9b´ã\81\8cã\81§ã\81\8dã\82\8bã\80\82 å\90\84ç\9b£è¦\96対象ã\81¯ä¸\80æ\84\8fã\81®ã\80\8cç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\80\8dã\82\92æ\8c\81ã\81¤ã\80\82 ã\81\93ã\82\8cã\81¯ç\9b£è¦\96対象ã\82\92ä½\9cæ\88\90ã\81\97ã\81\9fã\81¨ã\81\8dã\81«
 \fBinotify_add_watch\fP(2)  から返される整数である。
 .IP *
-監視しているファイルやディレクトリでイベントが起こると、 それらのイベントはアプリケーションから inotify ファイルディスクリプタから
\9b£è¦\96ã\81\97ã\81¦ã\81\84ã\82\8bã\83\95ã\82¡ã\82¤ã\83«ã\82\84ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81§ã\82¤ã\83\99ã\83³ã\83\88ã\81\8cèµ·ã\81\93ã\82\8bã\81¨ã\80\81 ã\81\9dã\82\8cã\82\89ã\81®ã\82¤ã\83\99ã\83³ã\83\88ã\81¯ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81\8bã\82\89 inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8bã\82\89
 \fBread\fP(2) を使って構造化データとして読み出すことができる (下記参照)。
 .IP *
 \fBinotify_rm_watch\fP(2)  は inotify の監視対象リストからアイテムを削除する。
 .IP *
-inotify インスタンスを指している 全てのファイルディスクリプタが (\fBclose\fP(2) を使って) クローズされた場合、
+inotify ã\82¤ã\83³ã\82¹ã\82¿ã\83³ã\82¹ã\82\92æ\8c\87ã\81\97ã\81¦ã\81\84ã\82\8b å\85¨ã\81¦ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8c (\fBclose\fP(2) ã\82\92使ã\81£ã\81¦) ã\82¯ã\83­ã\83¼ã\82ºã\81\95ã\82\8cã\81\9få ´å\90\88ã\80\81
 その下層にあるオブジェクトとそのリソースは、 カーネルで再利用するために解放される。 関連が切られた監視対象は自動的に解放される。
-
+.PP
 注意深くプログラミングすることで、 アプリケーションは inotify
 を使ってファイルシステムオブジェクトの集合の状態を効率的に監視しキャッシュしておくことができる。
 しかしながら、ロバストなアプリケーションでは、監視ロジックのバグや以下に説明があるような種類の競合条件によりファイルシステムの状態とキャッシュが一致しない状態になることがあるという事実も考慮に入れておくべきである。
 おそらく何らかの一貫性のチェックを行い、不一致が検出された場合にはキャッシュを再構築するのが懸命だろう。
-.SS "inotify ファイルディスクリプタからのイベントの読み出し"
-どのようなイベントが起こっていたかを知るには、 アプリケーションで inotify ファイルディスクリプタを \fBread\fP(2)  すればよい。
-これまでに何もイベントが起こっていない場合、 停止 (blocking) モードのファイルディスクリプタであれば、 少なくとも 1
+.SS "inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8bã\82\89ã\81®ã\82¤ã\83\99ã\83³ã\83\88ã\81®èª­ã\81¿å\87ºã\81\97"
\81©ã\81®ã\82\88ã\81\86ã\81ªã\82¤ã\83\99ã\83³ã\83\88ã\81\8cèµ·ã\81\93ã\81£ã\81¦ã\81\84ã\81\9fã\81\8bã\82\92ç\9f¥ã\82\8bã\81«ã\81¯ã\80\81 ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81§ inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\82\92 \fBread\fP(2)  ã\81\99ã\82\8cã\81°ã\82\88ã\81\84ã\80\82
\81\93ã\82\8cã\81¾ã\81§ã\81«ä½\95ã\82\82ã\82¤ã\83\99ã\83³ã\83\88ã\81\8cèµ·ã\81\93ã\81£ã\81¦ã\81\84ã\81ªã\81\84å ´å\90\88ã\80\81 å\81\9cæ­¢ (blocking) ã\83¢ã\83¼ã\83\89ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81§ã\81\82ã\82\8cã\81°ã\80\81 å°\91ã\81ªã\81\8fã\81¨ã\82\82 1
 つのイベントが起こるまで \fBread\fP(2)  は停止する (シグナルにより割り込まれなかった場合。
 シグナルによる割り込みがあった場合、呼び出しはエラー \fBEINTR\fP で失敗する。 \fBsignal\fP(7)  参照)。
 
-\fBread\fP(2)  が成功すると、以下の構造体を 1 つ以上含むバッファが返される:
+\fBread\fP(2)  ã\81\8cæ\88\90å\8a\9fã\81\99ã\82\8bã\81¨ã\80\81以ä¸\8bã\81®æ§\8bé\80 ä½\93ã\82\92 1 ã\81¤ä»¥ä¸\8aå\90«ã\82\80ã\83\90ã\83\83ã\83\95ã\82¡ã\83¼ã\81\8cè¿\94ã\81\95ã\82\8cã\82\8b:
 .in +4n
 .nf
 
@@ -89,8 +90,8 @@ inotify インスタンスを指している 全てのファイルディスク
 .\" "[patch] Fix type errors in inotify interfaces", 18 Nov 2008
 .\" Glibc bug filed: http://sources.redhat.com/bugzilla/show_bug.cgi?id=7040
 struct inotify_event {
-    int      wd;       /* 監視対象ディスクリプタ */
-    uint32_t mask;     /* ã\82¤ã\83\99ã\83³ã\83\88ã\81®マスク */
+    int      wd;       /* 監視対象ディスクリプタ */
+    uint32_t mask;     /* ã\82¤ã\83\99ã\83³ã\83\88ã\82\92示ã\81\99マスク */
     uint32_t cookie;   /* 関連するイベント群を関連づける
                           一意なクッキー (rename(2) 用) */
     uint32_t len;      /* \(aqname\(aq フィールドのサイズ */
@@ -100,7 +101,7 @@ struct inotify_event {
 .in
 
 \fIwd\fP はイベント発生の監視対象を指定する。 これは、前もって行われた \fBinotify_add_watch\fP(2)
-呼び出しで返された監視対象ディスクリプタのうちの 1 つである。
\91¼ã\81³å\87ºã\81\97ã\81§è¿\94ã\81\95ã\82\8cã\81\9fç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81®ã\81\86ã\81¡ã\81® 1 ã\81¤ã\81§ã\81\82ã\82\8bã\80\82
 
 \fImask\fP には発生したイベント (下記参照) を記述するためのビットが含まれる。
 
@@ -118,11 +119,11 @@ struct inotify_event {
 よって、 \fIinotify_event\fP 構造体のサイズは
 \fIsizeof(struct inotify_event)+len\fP である。
 
-\fBread\fP(2) に渡されたバッファが小さすぎて次のイベントに関する情報を返せ
+\fBread\fP(2) ã\81«æ¸¡ã\81\95ã\82\8cã\81\9fã\83\90ã\83\83ã\83\95ã\82¡ã\83¼ã\81\8cå°\8fã\81\95ã\81\99ã\81\8eã\81¦æ¬¡ã\81®ã\82¤ã\83\99ã\83³ã\83\88ã\81«é\96¢ã\81\99ã\82\8bæ\83\85å ±ã\82\92è¿\94ã\81\9b
 ない場合の動作はカーネルのバージョンにより異なる。 2.6.21 より前のカー
 ネルでは、 \fBread\fP(2) は 0 を返す。 2.6.21 以降のカーネルでは、
 \fBread\fP(2) はエラー \fBEINVAL\fP で失敗する。
-バッファサイズとして
\83\90ã\83\83ã\83\95ã\82¡ã\83¼ã\82µã\82¤ã\82ºã\81¨ã\81\97ã\81¦
 
     sizeof(struct inotify_event) + NAME_MAX + 1
 
@@ -134,7 +135,7 @@ struct inotify_event {
 \fBread\fP(2)  で返される \fImask\fP フィールドで返される:
 .RS 4
 .TP 
-\fBIN_ACCESS\fP (*)
+\fBIN_ACCESS\fP (+)
 (\fBread\fP(2), \fBexecve\fP(2) などで) ファイルがアクセスされた。
 .TP 
 \fBIN_ATTRIB\fP (*)
@@ -142,42 +143,48 @@ struct inotify_event {
 など)、拡張属性 (\fBsetxattr\fP(2))、 リンクカウント (Linux 2.6.25 以降; \fBlink\fP(2) のリンク先や
 \fBunlink\fP(2) など)、ユーザー/グループ ID (\fBchown\fP(2) など) などである。
 .TP 
-\fBIN_CLOSE_WRITE\fP (*)
+\fBIN_CLOSE_WRITE\fP (+)
 書き込みのためにオープンされたファイルがクローズされた。
 .TP 
 \fBIN_CLOSE_NOWRITE\fP (*)
-書き込み以外のためにオープンされたファイルがクローズされた。
+書き込み用としてはオープンされていないファイルやディレクトリがクローズされた。
 .TP 
-\fBIN_CREATE\fP (*)
+\fBIN_CREATE\fP (+)
 監視対象ディレクトリ内でファイルやディレクトリが作成された (\fBopen\fP(2)  \fBO_CREAT\fP, \fBmkdir\fP(2),
 \fBlink\fP(2), \fBsymlink\fP(2), UNIX ドメインソケットに対する \fBbind\fP(2) など)。
 .TP 
-\fBIN_DELETE\fP (*)
+\fBIN_DELETE\fP (+)
 監視対象ディレクトリ内でファイルやディレクトリが削除された。
 .TP 
 \fBIN_DELETE_SELF\fP
 監視対象のファイルやディレクトリ自身が削除あれた。 (このイベントはオブジェクトが別のファイルシステムに移動された場合にも発生する。 \fBmv\fP(1)
 は実際には別のファイルシステムにファイルをコピーした後、元のファイルシステムからそのファイルを削除するからである。) また、
-結果的に監視ディスクリプタに対して \fBIN_IGNORED\fP イベントも生成される。
+çµ\90æ\9e\9cç\9a\84ã\81«ç\9b£è¦\96ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«å¯¾ã\81\97ã\81¦ \fBIN_IGNORED\fP ã\82¤ã\83\99ã\83³ã\83\88ã\82\82ç\94\9fæ\88\90ã\81\95ã\82\8cã\82\8bã\80\82
 .TP 
-\fBIN_MODIFY\fP (*)
+\fBIN_MODIFY\fP (+)
 ファイルが変更された (\fBwrite\fP(2), \fBtruncate\fP(2) など)。
 .TP 
 \fBIN_MOVE_SELF\fP
 監視対象のディレクトリまたはファイル自身が移動された。
 .TP 
-\fBIN_MOVED_FROM\fP (*)
+\fBIN_MOVED_FROM\fP (+)
 ファイル名の変更を行った際に変更前のファイル名が含まれるディレクトリに対して生成される。
 .TP 
-\fBIN_MOVED_TO\fP (*)
+\fBIN_MOVED_TO\fP (+)
 ファイル名の変更を行った際に新しいファイル名が含まれるディレクトリに対して生成される。
 .TP 
 \fBIN_OPEN\fP (*)
-ファイルがオープンされた。
\83\95ã\82¡ã\82¤ã\83«ã\82\84ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81\8cã\82ªã\83¼ã\83\97ã\83³ã\81\95ã\82\8cã\81\9fã\80\82
 .RE
 .PP
-ディレクトリを監視する場合、 上記でアスタリスク (*) を付けたイベントは、 そのディレクトリ内のファイルに対して発生する。 このとき
-\fIinotify_event\fP 構造体で返される \fIname\fP フィールドは、ディレクトリ内のファイル名を表す。
+ディレクトリを監視する場合:
+.IP * 3
+上記でアスタリスク (*) が付いたイベントは、 ディレクトリ自身とディレクトリ内のオブジェクトのどちらに対しても発生する。
+.IP *
+上記でプラス記号 (+) が付いたイベントは、 ディレクトリ内のオブジェクトに対してのみ発生する (ディレクトリ自身に対しては発生しない)。
+.PP
+監視対象のディレクトリ内のオブジェクトに対してイベントが発生した場合、 \fIinotify_event\fP 構造体で返される \fIname\fP
+フィールドは、ディレクトリ内のファイル名を表す。
 .PP
 \fBIN_ALL_EVENTS\fP マクロは上記のイベント全てのマスクとして定義される。 このマクロは \fBinotify_add_watch\fP(2)
 を呼び出すときの \fImask\fP 引き数として使える。
@@ -207,13 +214,15 @@ struct inotify_event {
 を指定するとこのデフォルトの動作を変更でき、監視対象のディレクトリから子ファイルが削除された後に子ファイルに関するイベントが生成されなくなる。
 .TP 
 \fBIN_MASK_ADD\fP
-\fIpathname\fP に対する監視マスクが既に存在する場合、 (マスクの置き換えではなく) イベントを追加 (OR) する。
+監視インスタンスが \fIpathname\fP に対応するファイルシステムオブジェクトに対してすでに存在する場合に、 (マスクを置き換えるのではなく)
+監視マスクに \fImask\fP で指定されたイベントを追加 (OR) する。
 .TP 
 \fBIN_ONESHOT\fP
-1 つのイベントについて \fIpathname\fP を監視し、 イベントが発生したら監視対象リストから削除する。
+\fIpathname\fP に対応するファイルシステムオブジェクトを 1 イベントについてだけ監視し、 イベントが発生したら監視対象リストから削除する。
 .TP 
 \fBIN_ONLYDIR\fP (Linux 2.6.15 以降)
-\fIpathname\fP がディレクトリの場合にのみ監視する。
+\fIpathname\fP がディレクトリの場合のみ監視する。
+このフラグを使うことで、アプリケーションは、競合状態を考慮せずに、監視するオブジェクトがディレクトリであることを保証することができるようになる。
 .RE
 .PP
 以下のビットが \fBread\fP(2)  で返される \fImask\fP フィールドに設定される:
@@ -230,7 +239,7 @@ struct inotify_event {
 イベントキューが溢れた (このイベントの場合、\fIwd\fP は \-1 である)。
 .TP 
 \fBIN_UNMOUNT\fP
-監視対象オブジェクトを含むファイルシステムがアンマウントされた。さらに、この監視対象ディスクリプタに対して \fBIN_IGNORED\fP
\9b£è¦\96対象ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\82\92å\90«ã\82\80ã\83\95ã\82¡ã\82¤ã\83«ã\82·ã\82¹ã\83\86ã\83 ã\81\8cã\82¢ã\83³ã\83\9eã\82¦ã\83³ã\83\88ã\81\95ã\82\8cã\81\9fã\80\82ã\81\95ã\82\89ã\81«ã\80\81ã\81\93ã\81®ç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«å¯¾ã\81\97ã\81¦ \fBIN_IGNORED\fP
 イベントが生成される。
 .RE
 .SS 例
@@ -311,26 +320,26 @@ inotify は 2.6.13 の Linux カーネルに組込まれた。 これに必要
 .SH 準拠
 inotify API は Linux 独自のものである。
 .SH 注意
-inotify ファイルディスクリプタは \fBselect\fP(2), \fBpoll\fP(2), \fBepoll\fP(7)  を使って監視できる。
-イベントがある場合、ファイルディスクリプタは読み込み可能と通知する。
+inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¯ \fBselect\fP(2), \fBpoll\fP(2), \fBepoll\fP(7)  ã\82\92使ã\81£ã\81¦ç\9b£è¦\96ã\81§ã\81\8dã\82\8bã\80\82
\82¤ã\83\99ã\83³ã\83\88ã\81\8cã\81\82ã\82\8bå ´å\90\88ã\80\81ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¯èª­ã\81¿è¾¼ã\81¿å\8f¯è\83½ã\81¨é\80\9aç\9f¥ã\81\99ã\82\8bã\80\82
 
 Linux 2.6.25 以降では、シグナル駆動 (signal\-driven) I/O の通知が inotify
-ファイルディスクリプタについて利用可能である。 \fBfcntl\fP(2)  に書かれている (\fBO_ASYNC\fP フラグを設定するための)
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«ã\81¤ã\81\84ã\81¦å\88©ç\94¨å\8f¯è\83½ã\81§ã\81\82ã\82\8bã\80\82 \fBfcntl\fP(2)  ã\81«æ\9b¸ã\81\8bã\82\8cã\81¦ã\81\84ã\82\8b (\fBO_ASYNC\fP ã\83\95ã\83©ã\82°ã\82\92設å®\9aã\81\99ã\82\8bã\81\9fã\82\81ã\81®)
 \fBF_SETFL\fP, \fBF_SETOWN\fP, \fBF_SETSIG\fP の議論を参照のこと。 シグナルハンドラに渡される \fIsiginfo_t\fP
 構造体は、以下のフィールドが設定される (\fIsiginfo_t\fP は \fBsigaction\fP(2)  で説明されている)。 \fIsi_fd\fP には
-inotify ファイルディスクリプタ番号が、 \fIsi_signo\fP にはシグナル番号が、 \fIsi_code\fP には \fBPOLL_IN\fP が、
+inotify ファイルディスクリプタ番号が、 \fIsi_signo\fP にはシグナル番号が、 \fIsi_code\fP には \fBPOLL_IN\fP が、
 \fIsi_band\fP には \fBPOLLIN\fP が設定される。
 
-inotify ファイルディスクリプタに対して 連続して生成される出力 inotify イベントが同一の場合 (\fIwd\fP, \fImask\fP,
+inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«å¯¾ã\81\97ã\81¦ é\80£ç¶\9aã\81\97ã\81¦ç\94\9fæ\88\90ã\81\95ã\82\8cã\82\8bå\87ºå\8a\9b inotify ã\82¤ã\83\99ã\83³ã\83\88ã\81\8cå\90\8cä¸\80ã\81®å ´å\90\88 (\fIwd\fP, \fImask\fP,
 \fIcookie\fP, \fIname\fP が等しい場合)、 前のイベントがまだ読み込まれていなければ、 連続するイベントが 1 つのイベントにまとめられる
 (ただし「バグ」の節も参照のこと)。 これによりイベントキューに必要なカーネルメモリ量が減るが、
 これはまたアプリケーションがファイルイベント数を信頼性を持って数えるのに inotify を使用できないということでもある。
 
-inotify ファイルディスクリプタの読み込みで返されるイベントは、 順序付けられたキューになる。
-従って、たとえば、あるディレクトリの名前を別の名前に変更した場合、 inotify ファイルディスクリプタについての正しい順番で
+inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81®èª­ã\81¿è¾¼ã\81¿ã\81§è¿\94ã\81\95ã\82\8cã\82\8bã\82¤ã\83\99ã\83³ã\83\88ã\81¯ã\80\81 é \86åº\8fä»\98ã\81\91ã\82\89ã\82\8cã\81\9fã\82­ã\83¥ã\83¼ã\81«ã\81ªã\82\8bã\80\82
+å¾\93ã\81£ã\81¦ã\80\81ã\81\9fã\81¨ã\81\88ã\81°ã\80\81ã\81\82ã\82\8bã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81®å\90\8då\89\8dã\82\92å\88¥ã\81®å\90\8då\89\8dã\81«å¤\89æ\9b´ã\81\97ã\81\9få ´å\90\88ã\80\81 inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«ã\81¤ã\81\84ã\81¦ã\81®æ­£ã\81\97ã\81\84é \86ç\95ªã\81§
 イベントが生成されることが保証される。
 
-\fBFIONREAD\fP \fBioctl\fP(2)  は inotify ファイルディスクリプタから何バイト読み込めるかを返す。
+\fBFIONREAD\fP \fBioctl\fP(2)  ã\81¯ inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8bã\82\89ä½\95ã\83\90ã\82¤ã\83\88読ã\81¿è¾¼ã\82\81ã\82\8bã\81\8bã\82\92è¿\94ã\81\99ã\80\82
 .SS 制限と警告
 inotify API では、inotify イベントが発生するきっかけとなったユーザやプロセスに関する情報は提供されない。とりわけ、inotify
 経由でイベントを監視しているプロセスが、自分自身がきっかけとなったイベントと他のプロセスがきっかけとなったイベントを区別する簡単な手段はない。
@@ -340,14 +349,15 @@ inotify は、ファイルシステム API 経由でユーザー空間プログ
 (このようなイベントを捉えるにはアプリケーションはファイルシステムをポーリングする必要がある)。 さらに、 \fI/proc\fP, \fI/sys\fP,
 \fI/dev/pts\fP といったいくつかの疑似ファイルシステムは inotify で監視することができない。
 
-inotify API は \fBmmap\fP(2) と \fBmsync\fP(2) により起こったファイルのアクセスと変更を報告しない。
+inotify API は \fBmmap\fP(2), \fBmsync\fP(2), \fBmunmap\fP(2)
+により起こったファイルのアクセスと変更を報告しない。
 
 inotify API では影響が受けるファイルをファイル名で特定する。
 しかしながら、アプリケーションが inotify イベントを処理する時点では、
 そのファイル名がすでに削除されたり変更されたりしている可能性がある。
 
-inotify API では監視対象ディスクリプタを通してイベントが区別される。 (必要であれば)
-監視対象ディスクリプタとパス名のマッピングをキャッシュしておくのはアプリケーションの役目である。
+inotify API ã\81§ã\81¯ç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\82\92é\80\9aã\81\97ã\81¦ã\82¤ã\83\99ã\83³ã\83\88ã\81\8cå\8cºå\88¥ã\81\95ã\82\8cã\82\8bã\80\82 (å¿\85è¦\81ã\81§ã\81\82ã\82\8cã\81°)
\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¨ã\83\91ã\82¹å\90\8dã\81®ã\83\9eã\83\83ã\83\94ã\83³ã\82°ã\82\92ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\97ã\81¦ã\81\8aã\81\8fã\81®ã\81¯ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81®å½¹ç\9b®ã\81§ã\81\82ã\82\8bã\80\82
 ディレクトリの名前変更の場合、キャッシュしている複数のパス名に影響がある点に注意すること。
 
 inotify によるディレクトリの監視は再帰的に行われない: あるディレクトリ以下の
@@ -363,29 +373,35 @@ inotify によるディレクトリの監視は再帰的に行われない: あ
 イベントキューはオーバーフローする場合があることに注意すること。 この場合、イベントは失なわれる。 ロバスト性が求められるアプリケーションでは、
 イベントが失なわれる可能性も含めて適切に処理を行うべきである。
 例えば、アプリケーション内のキャッシュの一部分または全てを再構築する必要があるかもしれない。 (単純だが、おそらくコストがかかる方法は、 inotify
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\82\92ã\82¯ã\83­ã\83¼ã\82ºã\81\97ã\80\81 ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92空ã\81«ã\81\97ã\80\81 æ\96°ã\81\97ã\81\84 inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿を作成し、
-監視しているオブジェクトの監視対象ディスクリプタとキャッシュエントリーの再作成を行う方法である。)
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\82\92ã\82¯ã\83­ã\83¼ã\82ºã\81\97ã\80\81 ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92空ã\81«ã\81\97ã\80\81 æ\96°ã\81\97ã\81\84 inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼を作成し、
\9b£è¦\96ã\81\97ã\81¦ã\81\84ã\82\8bã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81®ç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¨ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82¨ã\83³ã\83\88ã\83ªã\83¼ã\81®å\86\8dä½\9cæ\88\90ã\82\92è¡\8cã\81\86æ\96¹æ³\95ã\81§ã\81\82ã\82\8bã\80\82)
 .SS "rename() イベントの取り扱い"
 上述の通り、 \fBrename\fP(2) により生成される \fBIN_MOVED_FROM\fP と \fBIN_MOVED_TO\fP イベントの組は、共有される
 cookie 値によって対応を取ることができる。 しかし、対応を取る場合にはいくつか難しい点がある。
 
-これらの 2 つのイベントは、 inotify ファイルディスクリプタから読み出しを行った場合に、通常はイベントストリーム内で連続している。
\81\93ã\82\8cã\82\89ã\81® 2 ã\81¤ã\81®ã\82¤ã\83\99ã\83³ã\83\88ã\81¯ã\80\81 inotify ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8bã\82\89読ã\81¿å\87ºã\81\97ã\82\92è¡\8cã\81£ã\81\9få ´å\90\88ã\81«ã\80\81é\80\9a常ã\81¯ã\82¤ã\83\99ã\83³ã\83\88ã\82¹ã\83\88ã\83ªã\83¼ã\83 å\86\85ã\81§é\80£ç¶\9aã\81\97ã\81¦ã\81\84ã\82\8bã\80\82
 しかしながら、連続していることは保証されていない。 複数のプロセスが監視対象オブジェクトでイベントを発生させた場合、 (めったに起こらないことだが)
 イベント \fBIN_MOVED_FROM\fP と \fBIN_MOVED_TO\fP の間に任意の数の他のイベントがはさまる可能性がある。
+さらに、対となるイベントがアトミックにキューに挿入されることも保証されていない。 \fBIN_MOVED_FROM\fP が現れたが
+\fBIN_MOVED_TO\fP は現れていないという短い期間がありえるということだ。
 
 したがって、 \fBrename\fP(2) により生成された \fBIN_MOVED_FROM\fP と \fBIN_MOVED_TO\fP
 のイベントの組の対応を取るのは本質的に難しいことである (監視対象のディレクトリの外へオブジェクトの rename が行われた場合には
 \fBIN_MOVED_TO\fP イベントは存在しさえしないことを忘れてはならない)。 (イベントは常に連続しているとの仮定を置くといった)
 発見的な方法を使うと、ほとんどの場合でイベントの組をうまく見つけることができるが、 いくつかの場合に見逃すことが避けられず、 アプリケーションが
 \fBIN_MOVED_FROM\fP と \fBIN_MOVED_TO\fP イベントが無関係だとみなしてしまう可能性がある。
-çµ\90æ\9e\9cç\9a\84ã\81«ã\80\81ç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\81\8cç ´æ£\84ã\81\95ã\82\8cå\86\8dä½\9cæ\88\90ã\81\95ã\82\8cã\81\9få ´å\90\88ã\80\81ã\81\93ã\82\8cã\82\89ã\81®ç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\81¯ã\80\81å\87¦ç\90\86å¾\85ã\81¡ã\82¤ã\83\99ã\83³ã\83\88ã\81®ç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿と一貫性のないものになってしまう
+çµ\90æ\9e\9cç\9a\84ã\81«ã\80\81ç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8cç ´æ£\84ã\81\95ã\82\8cå\86\8dä½\9cæ\88\90ã\81\95ã\82\8cã\81\9få ´å\90\88ã\80\81ã\81\93ã\82\8cã\82\89ã\81®ç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¯ã\80\81å\87¦ç\90\86å¾\85ã\81¡ã\82¤ã\83\99ã\83³ã\83\88ã\81®ç\9b£è¦\96対象ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼と一貫性のないものになってしまう
 (inotify ファイルディスクリプタの再作成とキャッシュの再構成はこの状況に対処するのに有用な方法なのだが)。
 
 また、アプリケーションは、 \fBIN_MOVED_FROM\fP イベントが今行った \fBread\fP(2)
-の呼び出しで返されたバッファのちょうど一番最後のイベントで、 \fBIN_MOVED_TO\fP イベントは次の \fBread\fP(2)
-を行わないと取得できない可能性も考慮に入れる必要がある。
+の呼び出しで返されたバッファーのちょうど一番最後のイベントで、 \fBIN_MOVED_TO\fP イベントは次の \fBread\fP(2)
+を行わないと取得できない可能性も考慮に入れる必要がある。 2 つ目の \fBread\fP(2) は (短い) タイムアウトで行うべきである。 これは、
+\fBIN_MOVED_FROM\fP\-\fBIN_MOVED_TO\fP のイベントペアのキューへの挿入はアトミックではなく、 また \fBIN_MOVED_TO\fP
+イベントが全く発生しない可能性もあるという事実を考慮に入れておく必要があるからである。
 .SH バグ
-.\" FIXME kernel commit 611da04f7a31b2208e838be55a42c7a1310ae321
+カーネル 3.17 時点では、 \fBfallocate\fP(2) の呼び出しでは inotify イベントが生成されない。
+
+.\" FIXME . kernel commit 611da04f7a31b2208e838be55a42c7a1310ae321
 .\" implies that unmount events were buggy 2.6.11 to 2.6.36
 .\"
 2.6.16 以前のカーネルでは \fBIN_ONESHOT\fP \fImask\fP フラグが働かない。
@@ -398,6 +414,235 @@ cookie 値によって対応を取ることができる。 しかし、対応を
 カーネル 2.6.25 より前では、 連続する同一のイベントを一つにまとめることを意図したコード (古い方のイベントがまだ読み込まれていない場合に、
 最新の 2 つのイベントを一つにまとめられる可能性がある) が、 最新のイベントが「最も古い」読み込まれていないイベントとまとめられるか
 をチェックするようになっていた。
+
+.\" FIXME . https://bugzilla.kernel.org/show_bug.cgi?id=77111
+\fBinotify_rm_watch\fP(2) の呼び出しにより監視対象ディスクリプターが削除された場合
+(なお、監視対象ファイルの削除や監視対象ファイルが含まれるファイルシステムのアンマウントによっても監視対象ディスクリプターは削除される)、
+この監視対象ディスクリプター関連の処理待ちの未読み出しイベントは、 読み出し可能なままとなる。 監視対象ディスクリプターは
+\fBinotify_add_watch\fP(2) によって後で割り当てられるため、 カーネルは利用可能な監視対象ディスクリプターの範囲 (0 から
+\fBINT_MAX\fP) から昇順にサイクリックに割り当てを行う。未使用の監視対象ディスクリプターを割り当てる際、 その監視対象ディスクリプター番号に
+inotify キューで処理待ちの未読み出しイベントがあるかの確認は行われない。 したがって、監視対象ディスクリプターが再割り当てされた際に、
+その監視対象ディスクリプターの一つ前の使用時に発生した処理待ちの未読み出しイベントが存在するということが起こりうる。
+その結果、アプリケーションはこれらのイベントを読み出す可能性があり、
+これらのイベントが新しく再利用された監視対象ディスクリプターに関連付けられたファイルに属するものかを解釈する必要が出て来る。
+実際のところ、このバグを踏む可能性は極めて低い。 それは、このバグを踏むためには、アプリケーションが \fBINT_MAX\fP
+個の監視対象ディスクリプターが一周させて、 キューに未読み出しイベントが残っている監視対象ディスクリプターを解放し、
+その監視対象ディスクリプターを再利用する必要があるからである。 この理由と、実世界のアプリケーションで発生したというバグ報告がないことから、 Linux
+3.15 時点では、この計算上は起こりうるバグを取り除くためのカーネルの変更は行われていない。
+.SH 例
+以下のプログラムは inotify API の使用例を示したものである。 コマンドライン引き数で渡されたディレクトリに印を付け、 タイプが
+\fBIN_OPEN\fP, \fBIN_CLOSE_NOWRITE\fP \fBIN_CLOSE_WRITE\fP のイベントを待つ。
+.PP
+以下は、 ファイル \fI/home/user/temp/foo\fP を編集し、 ディレクトリ \fI/tmp\fP の一覧表示を行った場合の出力である。
+対象のファイルとディレクトリがオープンされる前に、イベント \fBIN_OPEN\fP が発生している。 対象ファイルがクローズされた後にイベント
+\fBIN_CLOSE_WRITE\fP が発生している。 対象ディレクトリがクローズされた後にイベント \fBIN_CLOSE_NOWRITE\fP
+が発生している。 ユーザーが ENTER キーを押すると、プログラムの実行は終了する。
+.SS 出力例
+.in +4n
+.nf
+$ \fB./a.out /tmp /home/user/temp\fP
+Press enter key to terminate.
+Listening for events.
+IN_OPEN: /home/user/temp/foo [file]
+IN_CLOSE_WRITE: /home/user/temp/foo [file]
+IN_OPEN: /tmp/ [directory]
+IN_CLOSE_NOWRITE: /tmp/ [directory]
+
+Listening for events stopped.
+.fi
+.in
+.SS プログラムソース
+.nf
+#include <errno.h>
+#include <poll.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/inotify.h>
+#include <unistd.h>
+
+/* Read all available inotify events from the file descriptor 'fd'.
+   wd is the table of watch descriptors for the directories in argv.
+   argc is the length of wd and argv.
+   argv is the list of watched directories.
+   Entry 0 of wd and argv is unused. */
+
+static void
+handle_events(int fd, int *wd, int argc, char* argv[])
+{
+    /* Some systems cannot read integer variables if they are not
+       properly aligned. On other systems, incorrect alignment may
+       decrease performance. Hence, the buffer used for reading from
+       the inotify file descriptor should have the same alignment as
+       struct inotify_event. */
+
+    char buf[4096]
+        __attribute__ ((aligned(__alignof__(struct inotify_event))));
+    const struct inotify_event *event;
+    int i;
+    ssize_t len;
+    char *ptr;
+
+    /* Loop while events can be read from inotify file descriptor. */
+
+    for (;;) {
+
+        /* Read some events. */
+
+        len = read(fd, buf, sizeof buf);
+        if (len == \-1 && errno != EAGAIN) {
+            perror("read");
+            exit(EXIT_FAILURE);
+        }
+
+        /* If the nonblocking read() found no events to read, then
+           it returns \-1 with errno set to EAGAIN. In that case,
+           we exit the loop. */
+
+        if (len <= 0)
+            break;
+
+        /* バッファー内の全イベントを処理する */
+
+        for (ptr = buf; ptr < buf + len;
+                ptr += sizeof(struct inotify_event) + event\->len) {
+
+            event = (const struct inotify_event *) ptr;
+
+            /* Print event type */
+
+            if (event\->mask & IN_OPEN)
+                printf("IN_OPEN: ");
+            if (event\->mask & IN_CLOSE_NOWRITE)
+                printf("IN_CLOSE_NOWRITE: ");
+            if (event\->mask & IN_CLOSE_WRITE)
+                printf("IN_CLOSE_WRITE: ");
+
+            /* Print the name of the watched directory */
+
+            for (i = 1; i < argc; ++i) {
+                if (wd[i] == event\->wd) {
+                    printf("%s/", argv[i]);
+                    break;
+                }
+            }
+
+            /* Print the name of the file */
+
+            if (event\->len)
+                printf("%s", event\->name);
+
+            /* Print type of filesystem object */
+
+            if (event\->mask & IN_ISDIR)
+                printf(" [directory]\en");
+            else
+                printf(" [file]\en");
+        }
+    }
+}
+
+int
+main(int argc, char* argv[])
+{
+    char buf;
+    int fd, i, poll_num;
+    int *wd;
+    nfds_t nfds;
+    struct pollfd fds[2];
+
+    if (argc < 2) {
+        printf("Usage: %s PATH [PATH ...]\en", argv[0]);
+        exit(EXIT_FAILURE);
+    }
+
+    printf("Press ENTER key to terminate.\en");
+
+    /* Create the file descriptor for accessing the inotify API */
+
+    fd = inotify_init1(IN_NONBLOCK);
+    if (fd == \-1) {
+        perror("inotify_init1");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Allocate memory for watch descriptors */
+
+    wd = calloc(argc, sizeof(int));
+    if (wd == NULL) {
+        perror("calloc");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Mark directories for events
+       \- file was opened
+       \- file was closed */
+
+    for (i = 1; i < argc; i++) {
+        wd[i] = inotify_add_watch(fd, argv[i],
+                                  IN_OPEN | IN_CLOSE);
+        if (wd[i] == \-1) {
+            fprintf(stderr, "Cannot watch '%s'\en", argv[i]);
+            perror("inotify_add_watch");
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    /* ポーリングの準備 */
+
+    nfds = 2;
+
+    /* コンソールの入力 */
+
+    fds[0].fd = STDIN_FILENO;
+    fds[0].events = POLLIN;
+
+    /* Inotify input */
+
+    fds[1].fd = fd;
+    fds[1].events = POLLIN;
+
+    /* Wait for events and/or terminal input */
+
+    printf("Listening for events.\en");
+    while (1) {
+        poll_num = poll(fds, nfds, \-1);
+        if (poll_num == \-1) {
+            if (errno == EINTR)
+                continue;
+            perror("poll");
+            exit(EXIT_FAILURE);
+        }
+
+        if (poll_num > 0) {
+
+            if (fds[0].revents & POLLIN) {
+
+                /* Console input is available. Empty stdin and quit */
+
+                while (read(STDIN_FILENO, &buf, 1) > 0 && buf != '\en')
+                    continue;
+                break;
+            }
+
+            if (fds[1].revents & POLLIN) {
+
+                /* Inotify events are available */
+
+                handle_events(fd, wd, argc, argv);
+            }
+        }
+    }
+
+    printf("Listening for events stopped.\en");
+
+    /* Close inotify file descriptor */
+
+    close(fd);
+
+    free(wd);
+    exit(EXIT_SUCCESS);
+}
+.fi
 .SH 関連項目
 \fBinotifywait\fP(1), \fBinotifywatch\fP(1), \fBinotify_add_watch\fP(2),
 \fBinotify_init\fP(2), \fBinotify_init1\fP(2), \fBinotify_rm_watch\fP(2), \fBread\fP(2),
@@ -405,6 +650,6 @@ cookie 値によって対応を取ることができる。 しかし、対応を
 
 Linux カーネルソース内の \fIDocumentation/filesystems/inotify.txt\fP
 .SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.67 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.78 の一部
 である。プロジェクトの説明とバグ報告に関する情報は
 http://www.kernel.org/doc/man\-pages/ に書かれている。