OSDN Git Service

長音記号の修正を release に反映
[linuxjm/LDP_man-pages.git] / release / man2 / fcntl.2
index 180768f..345fb13 100644 (file)
@@ -1,8 +1,10 @@
 .\" t
 .\" This manpage is Copyright (C) 1992 Drew Eckhardt;
-.\"                 and Copyright (C) 1993 Michael Haardt, Ian Jackson;
-.\"                 and Copyright (C) 1998 Jamie Lokier;
-.\"                 and Copyright (C) 2002-2010 Michael Kerrisk.
+.\" and Copyright (C) 1993 Michael Haardt, Ian Jackson;
+.\" and Copyright (C) 1998 Jamie Lokier;
+.\" and Copyright (C) 2002-2010, 2014 Michael Kerrisk;
+.\" and Copyright (C) 2014 Jeff Layton
+.\" and Copyright (C) 2014 David Herrmann
 .\"
 .\" %%%LICENSE_START(VERBATIM)
 .\" Permission is granted to make and distribute verbatim copies of this
 .\"     Document F_SETOWN_EX and F_GETOWN_EX
 .\" 2010-06-17, Michael Kerrisk
 .\"    Document F_SETPIPE_SZ and F_GETPIPE_SZ.
+.\" 2014-07-08, David Herrmann <dh.herrmann@gmail.com>
+.\"     Document F_ADD_SEALS and F_GET_SEALS
 .\"
 .\"*******************************************************************
 .\"
 .\" This file was generated with po4a. Translate the source file.
 .\"
 .\"*******************************************************************
-.TH FCNTL 2 2012\-04\-15 Linux "Linux Programmer's Manual"
+.\"
+.\" Japanese Version Copyright (c) 1996 Takeshi Ueno
+.\" and Copyright (c) 2005, 2006, 2008 Akihiro MOTOKI
+.\" Translated 1996-07-03, Takeshi Ueno <tueno@vio.co.jp>
+.\" Modified 1998-09-10, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
+.\" Modified 1999-08-14, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
+.\" Updated & Modified 2001-04-03, Yuichi SATO <ysato@h4.dion.ne.jp>
+.\" Updated & Modified 2005-03-15, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
+.\" Updated & Modified 2005-04-22, Akihiro MOTOKI
+.\" Updated & Modified 2005-10-14, Akihiro MOTOKI
+.\" Updated & Modified 2005-11-19, Akihiro MOTOKI, LDP v2.14
+.\" Updated 2006-04-16, Akihiro MOTOKI, LDP v2.29
+.\" Updated 2008-02-11, Akihiro MOTOKI, LDP v2.77
+.\" Updated 2008-09-19, Akihiro MOTOKI, LDP v3.09
+.\" Updated 2010-04-23, Akihiro MOTOKI, LDP v3.24
+.\" Updated 2012-05-08, Akihiro MOTOKI <amotoki@gmail.com>
+.\" Updated 2013-03-26, Akihiro MOTOKI <amotoki@gmail.com>
+.\"
+.TH FCNTL 2 2015\-01\-22 Linux "Linux Programmer's Manual"
 .SH 名前
-fcntl \- ファイルディスクリプタの操作を行う
+fcntl \- ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81®æ\93\8dä½\9cã\82\92è¡\8cã\81\86
 .SH 書式
 .nf
 \fB#include <unistd.h>\fP
@@ -74,43 +96,52 @@ fcntl \- ファイルディスクリプタの操作を行う
 \fBint fcntl(int \fP\fIfd\fP\fB, int \fP\fIcmd\fP\fB, ... /* \fP\fIarg\fP\fB */ );\fP
 .fi
 .SH 説明
-\fBfcntl\fP()  は、オープンされたファイルディスクリプタ \fIfd\fP に関して下記の操作を行う。操作は \fIcmd\fP によって決まる:
+\fBfcntl\fP()  は、オープンされたファイルディスクリプタ \fIfd\fP に関して下記の操作を行う。操作は \fIcmd\fP によって決まる:
 
 \fBfcntl\fP() はオプションとして第三引き数をとることができる。 第三引き数が必要
 かどうかは \fIcmd\fP により決まる。必要な引き数の型は \fIcmd\fP 名の後ろの括弧内で
 指定されている (ほとんどの場合、必要な型は \fIint\fP であり、この引き数を表すの
 に \fIarg\fP という名前を使っている)。引き数が必要ない場合には \fIvoid\fP が指定さ
 れている。
-.SS ファイルディスクリプタの複製
+
+下記のいくつかの操作は特定のバージョンの Linux カーネルでのみサポートされている。
+ホストカーネルが特定の操作をサポートしているかを確認する推奨の方法は、 \fBfcntl\fP() を所望の \fIcmd\fP 値で呼び出し、 \fBEINVAL\fP
+で失敗するかを検査することである。 \fBEINVAL\fP が返った場合、カーネルがこの値を認識していないことを示す。
+.SS ファイルディスクリプターの複製
 .TP 
 \fBF_DUPFD\fP (\fIint\fP)
-利用可能なファイルディスクリプタのうち、 \fIarg\fP 以上で最小のものを探し、 \fIfd\fP のコピーとする。これは別の形の \fBdup2\fP(2)
-である。 \fBdup2\fP(2)  では指定されたディスクリプタが使われる点が違う。
\88©ç\94¨å\8f¯è\83½ã\81ªã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81®ã\81\86ã\81¡ã\80\81 \fIarg\fP ä»¥ä¸\8aã\81§æ\9c\80å°\8fã\81®ã\82\82ã\81®ã\82\92æ\8e¢ã\81\97ã\80\81 \fIfd\fP ã\81®ã\82³ã\83\94ã\83¼ã\81¨ã\81\99ã\82\8bã\80\82ã\81\93ã\82\8cã\81¯å\88¥ã\81®å½¢ã\81® \fBdup2\fP(2)
\81§ã\81\82ã\82\8bã\80\82 \fBdup2\fP(2)  ã\81§ã\81¯æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8c使ã\82\8fã\82\8cã\82\8bç\82¹ã\81\8cé\81\95ã\81\86ã\80\82
 .IP
-成功すると、新しいディスクリプタが返される。
\88\90å\8a\9fã\81\99ã\82\8bã\81¨ã\80\81æ\96°ã\81\97ã\81\84ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8cè¿\94ã\81\95ã\82\8cã\82\8bã\80\82
 .IP
 詳細は \fBdup\fP(2)  を参照のこと。
 .TP 
 \fBF_DUPFD_CLOEXEC\fP (\fIint\fP; Linux 2.6.24 以降)
-\fBF_DUPFD\fP と同様だが、それに加えて複製されたディスクリプタに対して close\-on\-exec フラグをセットする。
+\fBF_DUPFD\fP ã\81¨å\90\8cæ§\98ã\81 ã\81\8cã\80\81ã\81\9dã\82\8cã\81«å\8a ã\81\88ã\81¦è¤\87製ã\81\95ã\82\8cã\81\9fã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«å¯¾ã\81\97ã\81¦ close\-on\-exec ã\83\95ã\83©ã\82°ã\82\92ã\82»ã\83\83ã\83\88ã\81\99ã\82\8bã\80\82
 このフラグを指定することで、プログラムは \fBFD_CLOEXEC\fP フラグをセットするために \fBfcntl\fP()  の \fBF_SETFD\fP
 操作を追加で行う必要がなくなる。 このフラグがなぜ有用かについては、 \fBopen\fP(2)  の \fBO_CLOEXEC\fP の説明を参照のこと。
-.SS ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83»フラグ
-以下のコマンドを使って、ファイルディスクリプタに関連するフラグ を操作することができる。 現在のところ、定義されているフラグは一つだけである:
-\fBFD_CLOEXEC\fP (close\-on\-exec フラグ)。 \fBFD_CLOEXEC\fP ビットが 0 なら、ファイルディスクリプタは
+.SS ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼フラグ
+以ä¸\8bã\81®ã\82³ã\83\9eã\83³ã\83\89ã\82\92使ã\81£ã\81¦ã\80\81ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«é\96¢é\80£ã\81\99ã\82\8bã\83\95ã\83©ã\82° ã\82\92æ\93\8dä½\9cã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\82\8bã\80\82 ç\8f¾å\9c¨ã\81®ã\81¨ã\81\93ã\82\8dã\80\81å®\9a義ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\95ã\83©ã\82°ã\81¯ä¸\80ã\81¤ã\81 ã\81\91ã\81§ã\81\82ã\82\8b:
+\fBFD_CLOEXEC\fP (close\-on\-exec ã\83\95ã\83©ã\82°)ã\80\82 \fBFD_CLOEXEC\fP ã\83\93ã\83\83ã\83\88ã\81\8c 0 ã\81ªã\82\89ã\80\81ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¯
 \fBexecve\fP(2)  を行ってもオープンされたままだが、そうでない場合はクローズされる。
 .TP 
 \fBF_GETFD\fP (\fIvoid\fP)
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83»フラグを読み出す。 \fIarg\fP は無視される。
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼フラグを読み出す。 \fIarg\fP は無視される。
 .TP 
 \fBF_SETFD\fP (\fIint\fP)
-ファイルディスクリプタ・フラグに \fIarg\fP で指定した値を設定する。
+ファイルディスクリプターフラグに \fIarg\fP で指定した値を設定する。
+.PP
+マルチスレッドプログラムでは、 \fBfcntl\fP() の \fBF_SETFD\fP を使って close\-on\-exec フラグを設定するのと同時に、
+別のスレッドで \fBexecve\fP(2) と \fBfork\fP(2) を実行することは、競合条件次第では、
+そのファイルディスクリプターが子プロセスで実行されるプログラムに意図せず見えてしまうという危険性がある。 詳細とこの問題への対処法については
+\fBopen\fP(2) の \fBO_CLOEXEC\fP フラグの議論を参照のこと。
 .SS ファイル状態フラグ
 .\" or
 .\" .BR creat (2),
 オープンファイル記述 (open file description) には、 ファイル記述毎に設定される状態フラグがいくつかある。これらのフラグは
 \fBopen\fP(2)  によって初期化され、 \fBfcntl\fP(2)  により変更することもできる。これらは、 (\fBdup\fP(2),
-\fBfcntl\fP(F_DUPFD), \fBfork\fP(2)  などで) 複製されたファイルディスクリプタ同士は 同じオープンファイル記述を参照する。
+\fBfcntl\fP(F_DUPFD), \fBfork\fP(2)  などで) 複製されたファイルディスクリプタ同士は 同じオープンファイル記述を参照する。
 そのため、 同じファイル状態フラグが共有される。
 
 ファイル状態フラグとその意味は \fBopen\fP(2)  で説明されている。
@@ -120,17 +151,18 @@ fcntl \- ファイルディスクリプタの操作を行う
 \fIarg\fP は無視される。
 .TP 
 \fBF_SETFL\fP (\fIint\fP)
-.\" FIXME . According to POSIX.1-2001, O_SYNC should also be modifiable
-.\" via fcntl(2), but currently Linux does not permit this
-.\" See http://bugzilla.kernel.org/show_bug.cgi?id=5994
 ファイル状態フラグに \fIarg\fP で指定された値を設定する。 \fIarg\fP のうち、ファイルのアクセスモード (\fBO_RDONLY\fP,
 \fBO_WRONLY\fP, \fBO_RDWR\fP)  とファイル作成フラグ (すなわち \fBO_CREAT\fP, \fBO_EXCL\fP,
 \fBO_NOCTTY\fP, \fBO_TRUNC\fP)  に関するビットは無視される。 Linux では、このコマンドで変更できるのは
-\fBO_APPEND\fP, \fBO_ASYNC\fP, \fBO_DIRECT\fP, \fBO_NOATIME\fP, \fBO_NONBLOCK\fP フラグだけである。
-.SS アドバイザリ・ロック
-\fBF_GETLK\fP, \fBF_SETLK\fP, \fBF_SETLKW\fP は、レコード・ロックの獲得/解放/テストのために使用する
-(レコード・ロックはファイルセグメント・ロックや ファイル領域ロックとも呼ばれる)。 三番目の引き数 \fIlock\fP
-は、以下に示すフィールドを含む構造体へのポインタである (フィールドの順序は関係なく、構造体に他のフィールドがあってもよい)。
+\fBO_APPEND\fP, \fBO_ASYNC\fP, \fBO_DIRECT\fP, \fBO_NOATIME\fP, \fBO_NONBLOCK\fP
+フラグだけである。フラグ \fBO_DSYNC\fP, \fBO_SYNC\fP を変更することはできない。下記の「バグ」を参照。
+.SS アドバイザリーレコードロック
+Linux は昔からある (「プロセスに関連付けられる」) UNIX のレコードロックを実装している。 このレコードロックは POSIX
+で標準化されている。 Linux 固有のより良い動作を行うロックについては、下記のオープンファイル記述ロックの議論を参照のこと。
+
+\fBF_SETLK\fP, \fBF_SETLKW\fP, \fBF_GETLK\fP は、レコードロックの獲得/解放/テストのために使用する
+(レコードロックは、バイト範囲ロック、ファイルセグメントロック、ファイル領域ロックとも呼ばれる)。 三番目の引き数 \fIlock\fP
+は、以下に示すフィールドを含む構造体へのポインターである (フィールドの順序は関係なく、構造体に他のフィールドがあってもよい)。
 .in +4n
 .nf
 .sp
@@ -143,7 +175,7 @@ struct flock {
     off_t l_start;   /* Starting offset for lock */
     off_t l_len;     /* Number of bytes to lock */
     pid_t l_pid;     /* PID of process blocking our lock
-                        (F_GETLK only) */
+                        (set by F_GETLK and F_OFD_GETLK) */
     ...
 };
 .fi
@@ -159,8 +191,8 @@ struct flock {
 に負の値を指定することができる。
 
 \fIl_len\fP はロックしたいバイト数を示す。 \fIl_len\fP が正の場合、ロックされるバイト範囲は \fIl_start\fP 以上
-\fIl_start\fP+\fIl_len\fP\-\fI1\fP 以下となる。 \fIl_len\fP に 0 を指定した場合は特別な意味を持つ: \fIl_whence\fP
-and \fIl_start\fP で指定される位置からファイルの末尾までの全てのバイトをロックする
+\fIl_start\fP+\fIl_len\fP\-1 以下となる。 \fIl_len\fP に 0 を指定した場合は特別な意味を持つ: \fIl_whence\fP and
+\fIl_start\fP で指定される位置からファイルの末尾までの全てのバイトをロックする
 (ファイルがどんなに大きくなったとしてもファイルの末尾までロックする)。
 
 POSIX.1\-2001 では、負の値の \fIl_len\fP をサポートする実装を認めている (必須ではない)。 \fIl_len\fP
@@ -178,47 +210,122 @@ POSIX.1\-2001 では、負の値の \fIl_len\fP をサポートする実装を
 (\fIl_type\fP が \fBF_RDLCK\fP か \fBF_WRLCK\fP の場合は) ロックの獲得を、 (\fBF_UNLCK\fP の場合は)
 ロックの解放を、 \fIflock\fP 構造体のフィールド \fIl_whence\fP, \fIl_start\fP, \fIl_len\fP
 で指定された範囲のバイトに対して行う。 指定されたロックが他のプロセスが設定しているロックと衝突する場合は、 \-1 を返し、 \fIerrno\fP に
-\fBEACCES\fP か \fBEAGAIN\fP を設定する。
+\fBEACCES\fP か \fBEAGAIN\fP を設定する。 (この場合に返されるエラーは実装により異なる。 そのため、 POSIX
+では移植性が必要なアプリケーションでは、 これらの両方のエラーをチェックすることが必要としている。)
 .TP 
 \fBF_SETLKW\fP (\fIstruct flock *\fP)
 \fBF_SETLK\fP と同様だが、こちらではそのファイルに対して衝突するロックが 適用されていた場合に、そのロックが解放されるのを待つ点が異なる。
-å¾\85ã\81£ã\81¦ã\81\84ã\82\8bé\96\93ã\81«ã\82·ã\82°ã\83\8aã\83«ã\82\92å\8f\97ã\81\91ã\81\9få ´å\90\88ã\81¯ã\80\81ã\82·ã\82¹ã\83\86ã\83 ã\82³ã\83¼ã\83«ã\81¯ä¸­æ\96­ã\81\95ã\82\8cã\80\81 (ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\81\8cæ\88»ã\81£ã\81\9fç\9b´å¾\8cã\81«) è¿\94ã\82\8aå\80¤ \-1 ã\82\92è¿\94ã\81\99 (ã\81¾ã\81\9f \fIerrno\fP ã\81«
-\fBEINTR\fP が設定される; \fBsignal\fP(7)  参照)。
+å¾\85ã\81£ã\81¦ã\81\84ã\82\8bé\96\93ã\81«ã\82·ã\82°ã\83\8aã\83«ã\82\92å\8f\97ã\81\91ã\81\9få ´å\90\88ã\81¯ã\80\81ã\82·ã\82¹ã\83\86ã\83 ã\82³ã\83¼ã\83«ã\81¯ä¸­æ\96­ã\81\95ã\82\8cã\80\81 (ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81\8cæ\88»ã\81£ã\81\9fç\9b´å¾\8cã\81«) è¿\94ã\82\8aå\80¤ \-1 ã\82\92è¿\94ã\81\99 (ã\81¾ã\81\9f \fIerrno\fP
+に \fBEINTR\fP が設定される; \fBsignal\fP(7)  参照)。
 .TP 
 \fBF_GETLK\fP (\fIstruct flock *\fP)
 このコールの呼び出し時には、 \fIlock\fP にはそのファイルに適用しようとするロックに関する情報が入っている。 ロックを適用できる場合には、
-\fBfcntl\fP()  は実際にはロックを行わず、構造体 \fIlock\fP の \fIl_type\fP フィールドに \fBF_UNLCK\fP
-を設定し、他のフィールドは変更せずに、復帰する。 違う種別のロックが (一つもしくは複数) 適用されていて ロックを適用できないような場合には、
-\fBfcntl\fP()  は、原因となったロックの一つについての詳細情報を構造体 \fIlock\fP のフィールド \fIl_type\fP,
-\fIl_whence\fP, \fIl_start\fP, \fIl_len\fP に格納し、また \fIl_pid\fP にロックを保持しているプロセスの PID
-を設定して、復帰する。
+\fBfcntl\fP()  は実際にはロックを行わず、 構造体 \fIlock\fP の \fIl_type\fP フィールドに \fBF_UNLCK\fP を返し、
+他のフィールドは変更しない。
+
+違う種別のロックが (一つもしくは複数) 適用されていてロックを適用できないような場合には、 \fBfcntl\fP() は、
+原因となったロックの一つについての詳細を、 \fIlock\fP のフィールド \fIl_type\fP, \fIl_whence\fP, \fIl_start\fP,
+\fIl_len\fP で返す。 衝突するロックが昔からある (プロセスに関連付けられる) レコードロックの場合、 \fIl_pid\fP
+フィールドにロックを保持しているプロセスの PID が設定される。 衝突するロックがオープンファイル記述ロックの場合、 \fIl_pid\fP に \-1
+が設定される。 呼び出し元がその内容を参照した時点では、 返された情報はすでに古いものとなっている可能性がある点に注意すること。
 .P
 読み出しロックを適用するには、 \fIfd\fP は読み出し用にオープンされていなければならない。 書き込みロックを適用するには、 \fIfd\fP
 は書き込み用にオープンされていなければならない。 読み書き両方のロックを適用するには、読み書き両用で ファイルをオープンしなければならない。
-.P
-.\" (Additional file descriptors referring to the same file
-.\" may have been obtained by calls to
-.\" .BR open "(2), " dup "(2), " dup2 "(2), or " fcntl ().)
-レコードのロックは、 \fBF_UNLCK\fP により明示的に削除されるだけでなく、 プロセスが終了したときや、ロックが適用されているファイルを参照している
-ファイルディスクリプタのいずれかがクローズされた場合にも解放される。 このロックの解放は自動的に行われる。 この動作はまずい: あるプロセスが
-\fI/etc/passwd\fP や \fI/etc/mtab\fP といったファイルにロックを適用しているときに、
-あるライブラリ関数が何かの理由で同じファイルを open, read, close すると、そのファイルへのロックが失われることになる。
+
+\fBF_SETLKW\fP でロックを適用する際、 カーネルは\fIデッドロック\fPの検出を行う。 2 つ以上のプロセスが、
+他のプロセスが保持するロックにより互いにブロックされるようなロック要求を行っているかを検査する。 例えば、 プロセス A があるファイルのバイト 100
+に対して書き込みロックを保持していて、 プロセス B がバイト 200 に対して書き込みロックを保持しているとする。 各プロセスが
+\fBF_SETLKW\fP を使って他のプロセスによるすでにロックされているバイトをロックしようとすると、 デッドロック検出がない場合、
+両方のプロセスが無限に停止することになる。 カーネルはこのようなデッドロックを検出すると、 停止していたロック要求の一つをエラー \fBEDEADLK\fP
+ですぐに失敗させる。 このエラーを受け取ったアプリケーションは、 必要なロックを再度獲得しようとする前に、
+他のアプリケーションが実行できるように自分が保持するロックのいくつかを解放する必要がある。 3
+つ以上のプロセスが関連する循環するデッドロックも検出される。 ただし、 カーネルのデッドロック検出アルゴリズムには制限がある点に注意すること。
+「バグ」を参照。
+
+ろコードロックは \fBF_UNLCK\fP で明示的に削除されるだけでなく、 そのプロセスが終了した際には自動的に解放される。
 .P
 レコードのロックは \fBfork\fP(2)  で作成された子プロセスには継承されないが、 \fBexecve\fP(2)  の前後では保存される。
 .P
-\fBstdio\fP(3)  ではバッファリングが行われるので、 stdio 関連の関数ではレコードのロックの使用は回避される; 代わりに
+\fBstdio\fP(3)  ã\81§ã\81¯ã\83\90ã\83\83ã\83\95ã\82¡ã\83¼ã\83ªã\83³ã\82°ã\81\8cè¡\8cã\82\8fã\82\8cã\82\8bã\81®ã\81§ã\80\81 stdio é\96¢é\80£ã\81®é\96¢æ\95°ã\81§ã\81¯ã\83¬ã\82³ã\83¼ã\83\89ã\81®ã\83­ã\83\83ã\82¯ã\81®ä½¿ç\94¨ã\81¯å\9b\9eé\81¿ã\81\95ã\82\8cã\82\8b; ä»£ã\82\8fã\82\8aã\81«
 \fBread\fP(2)  や \fBwrite\fP(2)  を使用すること。
+
+上記で説明したレコードロックはプロセスと関連付けられる (以下で説明するオープンファイル記述ロックと異なる点である)。 そのため、
+残念ながら以下のようなことが起こる。
+.IP * 3
+.\" (Additional file descriptors referring to the same file
+.\" may have been obtained by calls to
+.\" .BR open "(2), " dup "(2), " dup2 "(2), or " fcntl ().)
+プロセスがロックが適用されているファイルを参照しているファイルディスクリプターの「いずれか」をクローズした場合、
+そのファイルに対するそのプロセスのすべてのロックが解放される。 この動作はまずい。 あるプロセスが \fI/etc/passwd\fP や
+\fI/etc/mtab\fP といったファイルにロックを適用しているときに、 あるライブラリ関数が何かの理由で同じファイルを open, read,
+close すると、そのファイルへのロックが失われることになる。
+.IP *
+1 つのプロセス内のスレッドはロックを共有する。 言い換えると、 マルチスレッドのプログラムで、 レコードロックを使って、 複数のスレッドが同時に 1
+つのファイルの同じ領域にアクセスしないようにすることはできないということだ。
+.PP
+オープンファイル記述ロックを使うとこれらの問題が解決できる。
+.SS "オープンファイル記述ロック (非 POSIX)"
+オープンファイル記述ロックはバイト範囲に対するアドバイザリーロックで、 ほとんどの点で上述の昔からあるレコードロックと等価である。 このロック種別は
+Linux 固有であり、 Linux 3.15 以降で利用できる。 オープンファイル記述の説明は \fBopen\fP(2) を参照。
+
+2 つのロック種別の主な違いは、 昔からあるレコードロックはプロセスに関連付けられるのに対して、
+オープンファイル記述ロックはロックが獲得されるオープンファイル記述に関連付けられる点である。 この動作は \fBflock\fP(2)
+で獲得されるロックによく似ている。 結果として (昔からあるアドバイザリーレコードロックと違い)、 オープンファイル記述ロックは \fBfork\fP(2)
+(や \fBCLONE_FILES\fP 付きの \fBclone\fP(2)) の前後で継承され、 ファイルのクローズ時に解放されるのではなく、
+オープンファイル記述の最後のクローズ時にのみ自動的に解放される。
+.PP
+オープンファイル記述ロックは常に昔からあるレコードロックと競合する。 たとえ、
+ロックが同じプロセスによって同じファイルディスクリプターに対して行われたとしてもである。
+
+同じオープンファイル記述経由 (同じファイルディスクリプター経由や \fBfork\fP(2), \fBdup\fP(2), \fBfcntl\fP(2)
+\fBF_DUPFD\fP などで作成されたファイルディスクリプターの複製経由) で適用されたオープンファイル記述ロックは常に互換性がある。 つまり、
+すでにロックされている領域に対して新しいロックが適用された場合、 既存のロックは新しいロック種別に変換される。 (上記で説明した通り、
+このような変換の結果、 既存のロックの分割、 縮小、 結合が行われることがある。)
+
+一方、 異なるオープンファイル記述経由で獲得されると、 オープンファイル記述ロックは互いに競合する。 したがって、
+マルチスレッドプログラムのスレッドは、 各スレッドがそれぞれ自分で \fBopen\fP(2) を実行し、
+得られたファイルディスクリプター経由でロックを適用することで、
+オープンファイル記述ロックを使って一つのファイル領域えのアクセスを同期させることができる。
+.PP
+昔からあるレコードロックの場合と同様、 \fBfcntl\fP() の第 3 引き数 \fIlock\fP は \fIflock\fP 構造体へのポインターである。
+昔からあるレコードロックと違い、 下記で説明するコマンドを使う際には、 この構造体のフィールド \fIl_pid\fP に 0 を設定しなければならない。
+
+オープンファイル記述ロックで使用できるコマンドは、 昔からあるロックのコマンドと同じである。
+.TP 
+\fBF_OFD_SETLK\fP (\fIstruct flock *\fP)
+(\fIl_type\fP が \fBF_RDLCK\fP か \fBF_WRLCK\fP の場合は) オープンファイル記述のロックの獲得を、 (\fBF_UNLCK\fP
+の場合は) オープンファイル記述のロックの解放を、 \fIflock\fP 構造体のフィールド \fIl_whence\fP, \fIl_start\fP,
+\fIl_len\fP で指定された範囲のバイトに対して行う。 指定されたロックが他のプロセスが設定しているロックと衝突する場合は、 \-1 を返し、
+\fIerrno\fP に \fBEAGAIN\fP を設定する。
+.TP 
+\fBF_OFD_SETLKW\fP (\fIstruct flock *\fP)
+\fBF_OFD_SETLK\fP と同様だが、こちらではそのファイルに対して衝突するロックが
+適用されていた場合に、そのロックが解放されるのを待つ点が異なる。 待っている間にシグナルを受けた場合は、システムコールは中断され、
+(シグナルハンドラーが戻った直後に) 返り値 \-1 を返す (また \fIerrno\fP に \fBEINTR\fP が設定される; \fBsignal\fP(7)
+参照)。
+.TP 
+\fBF_OFD_GETLK\fP (\fIstruct flock *\fP)
+このコールの呼び出し時には、 \fIlock\fP にはそのファイルに適用しようとするロックに関する情報が入っている。 ロックを適用できる場合には、
+\fBfcntl\fP()  は実際にはロックを行わず、 構造体 \fIlock\fP の \fIl_type\fP フィールドで \fBF_UNLCK\fP を返し、
+他のフィールドは変更しない。 違う種別のロックが (一つもしくは複数) 適用されていてロックを適用できないような場合には、
+原因となったロックの一つについての詳細が \fIlock\fP で返される。 詳細は上記の \fBF_GETLK\fP を参照。
+.PP
+.\" commit 57b65325fe34ec4c917bc4e555144b4a94d9e1f7
+.\"
+現在の実装では、 オープンファイル記述ロクではデッドロックの検出は行われない。 (これがプロセスと関連付けられるレコードロックとは異なる点である。
+プロセスと関連付けられるレコードロックではカーネルはデッドロックの検出を行う。)
 .SS "強制ロック (mandatory locking)"
-上述のロックにはアドバイザリ・ロック (advisory lock) と強制ロック (mandatory lock)
-の二種類があるが、デフォルトではアドバイザリ・ロックとなる。
+\fI警告\fP: Linux の強制ロックの実装は信頼性に欠けるものである。 下記の「バグ」の節を参照のこと。
 
-アドバイザリ・ロックに強制力はなく、協調して動作するプロセス間でのみ 有効である。
+デフォルトでは、 昔からある (プロセスに関連付けられる) レコードロックも、 オープンファイル記述のろコードロックも、 アドバイザリーロックである。
+アドバイザリーロックに強制力はなく、協調して動作するプロセス間でのみ有効である。
 
-強制ロックは全てのプロセスに対して効果がある。 あるプロセスが互換性のない強制ロックが適用されたファイル領域に対して (\fBread\fP(2)  や
-\fBwrite\fP(2)  により) 互換性のないアクセスを実行しようとした場合、 アクセスの結果は そのファイルのオープンファイル記述で
-\fBO_NONBLOCK\fP フラグが有効になっているかにより決まる。 \fBO_NONBLOCK\fP
-フラグが有効になっていないときは、ロックが削除されるか、 ロックがアクセスと互換性のあるモードに変換されるまで、 システムコールは停止 (block)
-される。 \fBO_NONBLOCK\fP フラグが有効になっているときは、システムコールはエラー \fBEAGAIN\fP で失敗する。
+両方のタイプのロックも強制ロックにすることもできる。 強制ロックは全てのプロセスに対して効果がある。
+あるプロセスが互換性のない強制ロックが適用されたファイル領域に対して (\fBread\fP(2)  や \fBwrite\fP(2)  により)
+互換性のないアクセスを実行しようとした場合、 アクセスの結果は そのファイルのオープンファイル記述で \fBO_NONBLOCK\fP
+フラグが有効になっているかにより決まる。 \fBO_NONBLOCK\fP フラグが有効になっていないときは、ロックが削除されるか、
+ロックがアクセスと互換性のあるモードに変換されるまで、 システムコールは停止 (block) される。 \fBO_NONBLOCK\fP
+フラグが有効になっているときは、システムコールはエラー \fBEAGAIN\fP で失敗する。
 
 強制ロックを使用するためには、ロック対象のファイルが含まれるファイルシステム
 と、ロック対象のファイル自身の両方について、強制ロックが有効になっていなけれ ばならない。ファイルシステムについて強制ロックを有効にするには、
@@ -226,26 +333,27 @@ POSIX.1\-2001 では、負の値の \fIl_len\fP をサポートする実装を
 フラグを指定する。ファイルについて強制ロックを有効にするには、 そのファイルのグループ実行許可 (group execute permission)
 を無効とし、 かつ set\-group\-ID 許可ビットを有効にする (\fBchmod\fP(1)  と \fBchmod\fP(2)  を参照)。
 
-Linux の強制ロックの実装は信頼性に欠けるものである。 下記の「バグ」の節を参照のこと。
+強制ロックは POSIX では規定されていない。 他のいくつかのシステムでも強制ロックはサポートされているが、
+強制ロックをどのようにして有効にするかの詳細はシステムより異なる。
 .SS シグナルの管理
 \fBF_GETOWN\fP, \fBF_SETOWN\fP, \fBF_GETOWN_EX\fP, \fBF_SETOWN_EX\fP, \fBF_GETSIG\fP,
 \fBF_SETSIG\fP は、I/O が利用可能になったことを示すシグナルを管理するために使用される。
 .TP 
 \fBF_GETOWN\fP (\fIvoid\fP)
-ファイルディスクリプタ \fIfd\fP のイベントに対するシグナル \fBSIGIO\fP および \fBSIGURG\fP を受けているプロセスのプロセスID
+ファイルディスクリプタ \fIfd\fP のイベントに対するシグナル \fBSIGIO\fP および \fBSIGURG\fP を受けているプロセスのプロセスID
 かプロセスグループを (関数の結果として) 返す。 プロセスID は正の値として返される。 プロセスグループID は負の値として返される
 (下記のバグの章を参照)。 \fIarg\fP は無視される。
 .TP 
 \fBF_SETOWN\fP (\fIint\fP)
-ファイルディスクリプタ \fIfd\fP のイベント発生を知らせるシグナル \fBSIGIO\fP や \fBSIGURG\fP を受けるプロセスの プロセス ID
+ファイルディスクリプタ \fIfd\fP のイベント発生を知らせるシグナル \fBSIGIO\fP や \fBSIGURG\fP を受けるプロセスの プロセス ID
 またはプロセスグループID を \fIarg\fP で指定された ID に設定する。 プロセスID は正の値として指定し、 プロセスグループID
 は負の値として指定する。 ほとんどの場合、呼び出し元プロセスは所有者として自分自身を指定する (つまり \fIarg\fP に \fBgetpid\fP(2)
 を指定する)。
 
 .\" From glibc.info:
-\fBfcntl\fP()  の \fBF_SETFL\fP コマンドを使用してファイルディスクリプタに \fBO_ASYNC\fP
\8a¶æ\85\8bã\83\95ã\83©ã\82°ã\82\92設å®\9aã\81\97ã\81\9få ´å\90\88ã\81«ã\81¯ã\80\81ã\81\9dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\81¸ã\81® å\85¥å\87ºå\8a\9bã\81\8cå\8f¯è\83½ã\81«ã\81ªã\82\8b度ã\81« \fBSIGIO\fP ã\82·ã\82°ã\83\8aã\83«ã\81\8cé\80\81ã\82\89ã\82\8cã\82\8bã\80\82 \fBF_SETSIG\fP ã\81¯
-\fBSIGIO\fP 以外の別のシグナルの配送を受けられるように するのにも使うことができる。 許可 (permission)
+\fBfcntl\fP()  ã\81® \fBF_SETFL\fP ã\82³ã\83\9eã\83³ã\83\89ã\82\92使ç\94¨ã\81\97ã\81¦ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81« \fBO_ASYNC\fP
\8a¶æ\85\8bã\83\95ã\83©ã\82°ã\82\92設å®\9aã\81\97ã\81\9få ´å\90\88ã\81«ã\81¯ã\80\81ã\81\9dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¸ã\81® å\85¥å\87ºå\8a\9bã\81\8cå\8f¯è\83½ã\81«ã\81ªã\82\8b度ã\81« \fBSIGIO\fP ã\82·ã\82°ã\83\8aã\83«ã\81\8cé\80\81ã\82\89ã\82\8cã\82\8bã\80\82 \fBF_SETSIG\fP
+は \fBSIGIO\fP 以外の別のシグナルの配送を受けられるように するのにも使うことができる。 許可 (permission)
 のチェックで失敗した場合には、 シグナルは黙って捨てられる。
 
 \fBF_SETOWN\fP により指定された所有者のプロセス (またはプロセスグループ) に シグナルを送る際には、 \fBkill\fP(2)
@@ -262,7 +370,7 @@ Linux の強制ロックの実装は信頼性に欠けるものである。 下
 .\" .I fd
 .\" refers to a terminal device, then SIGIO
 .\" signals are sent to the foreground process group of the terminal.
-ファイルディスクリプタがソケットを参照している場合は、 \fBF_SETOWN\fP を使用して、ソケットに帯域外 (out\-of\-band)
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8cã\82½ã\82±ã\83\83ã\83\88ã\82\92å\8f\82ç\85§ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81 \fBF_SETOWN\fP ã\82\92使ç\94¨ã\81\97ã\81¦ã\80\81ã\82½ã\82±ã\83\83ã\83\88ã\81«å¸¯å\9f\9få¤\96 (out\-of\-band)
 データが届いた時に \fBSIGURG\fP シグナルを配送する相手を選択することもできる (\fBSIGURG\fP が送られた場合には \fBselect\fP(2)
 がソケットが「特別な状態」にあると報告することだろう)。
 
@@ -275,12 +383,12 @@ Linux の強制ロックの実装は信頼性に欠けるものである。 下
 .\" kill_fasync()/send_sigio()/send_sigio_to_task()
 .\" to directly call send_group_sig_info()
 .\"    -- MTK, Apr 2005 (kernel 2.6.11)
\82¹ã\83¬ã\83\83ã\83\89ã\82°ã\83«ã\83¼ã\83\97ã\82\92ã\82µã\83\9dã\83¼ã\83\88ã\81\97ã\81¦ã\81\84ã\82\8bã\82¹ã\83¬ã\83\83ã\83\89ã\83©ã\82¤ã\83\96ã\83©ã\83ª (ä¾\8bã\81\88ã\81° NPTL) ã\82\92 ä½¿ã\81£ã\81¦å\8b\95ä½\9cã\81\97ã\81¦ã\81\84ã\82\8bã\83\9eã\83«ã\83\81ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\83\97ã\83­ã\82»ã\82¹ã\81§ \fBF_SETSIG\fP ã\81«
+スレッドグループをサポートしているスレッドライブラリ (例えば NPTL) を 使って動作しているマルチスレッドプロセスで \fBF_SETSIG\fP に
 0 以外の値を指定した場合、 \fBF_SETOWN\fP に正の値を渡すと、その意味が違ってくる: プロセス全体を示すプロセスID
 ではなく、プロセス内の特定の スレッドを示すスレッドID と解釈される。 したがって、 \fBF_SETSIG\fP
 を使う場合には、きちんと結果を受け取るには、 \fBF_SETOWN\fP に渡す値を \fBgetpid\fP(2)  ではなく \fBgettid\fP(2)
\81®è¿\94ã\82\8aå\80¤ã\81«ã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8bã\81 ã\82\8dã\81\86ã\80\82 (ç\8f¾ç\8a¶ã\81® Linux ã\82¹ã\83¬ã\83\83ã\83\89å®\9fè£\85ã\81§ã\81¯ã\80\81ã\83¡ã\82¤ã\83³ã\83»ã\82¹ã\83¬ã\83\83ã\83\89ã\81®ã\82¹ã\83¬ã\83\83ã\83\89ID ã\81¯ ã\81\9dã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\81®ã\83\97ã\83­ã\82»ã\82¹ID
\81¨å\90\8cã\81\98ã\81§ã\81\82ã\82\8bã\80\82ã\81¤ã\81¾ã\82\8aã\80\81 ã\82·ã\82°ã\83\8aã\83«ã\83»ã\82¹ã\83¬ã\83\83ã\83\89ã\81®ã\83\97ã\83­ã\82°ã\83©ã\83 ã\81§ã\81¯ã\81\93ã\81®å ´å\90\88 \fBgettid\fP(2)  ã\81¨ \fBgetpid\fP(2)
+の返り値にする必要があるだろう。 (現状の Linux スレッド実装では、メインスレッドのスレッドID は そのスレッドのプロセスID
+と同じである。つまり、 シグナルスレッドのプログラムではこの場合 \fBgettid\fP(2)  と \fBgetpid\fP(2)
 は全く同じように使うことができる。)  ただし、注意すべき点として、この段落で述べたことは、 ソケットの帯域外データが届いたときに生成される
 \fBSIGURG\fP シグナルにはあてはまらない。 このシグナルは常にプロセスかプロセスグループに送られ、 送信先は \fBF_SETOWN\fP
 に渡された値にしたがって決められる。
@@ -290,7 +398,7 @@ Linux の強制ロックの実装は信頼性に欠けるものである。 下
 \fBSIGIO\fP と \fBSIGURG\fP を送るには \fBF_SETOWN_EX\fP を使うこと。
 .TP 
 \fBF_GETOWN_EX\fP (struct f_owner_ex *) (Linux 2.6.32 以降)
-直前の \fBF_SETOWN_EX\fP 操作で定義された現在のファイルディスクリプタの所有者設定 を返す。情報は \fIarg\fP
\9b´å\89\8dã\81® \fBF_SETOWN_EX\fP æ\93\8dä½\9cã\81§å®\9a義ã\81\95ã\82\8cã\81\9fç\8f¾å\9c¨ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81®æ\89\80æ\9c\89è\80\85設å®\9a ã\82\92è¿\94ã\81\99ã\80\82æ\83\85å ±ã\81¯ \fIarg\fP
 が指す構造体に格納されて返される。構造体は以下の通りである。
 .nf
 .in +4n
@@ -309,7 +417,7 @@ struct f_owner_ex {
 \fBF_SETOWN_EX\fP (struct f_owner_ex *) (Linux 2.6.32 以降)
 この操作は \fBF_SETOWN\fP と同様の処理を行う。 この操作を使うと、I/O が利用可能になったことを示すシグナルを、
 特定のスレッド、プロセス、プロセスグループに送ることができる ようになる。 呼び出し元は、 \fIarg\fP 経由でシグナルの配送先を指定する。
-\fIarg\fP は \fIf_owner_ex\fP 構造体へのポインタである。 \fItype\fP フィールドは以下のいずれかの値を取り、 この値により
+\fIarg\fP ã\81¯ \fIf_owner_ex\fP æ§\8bé\80 ä½\93ã\81¸ã\81®ã\83\9dã\82¤ã\83³ã\82¿ã\83¼ã\81§ã\81\82ã\82\8bã\80\82 \fItype\fP ã\83\95ã\82£ã\83¼ã\83«ã\83\89ã\81¯ä»¥ä¸\8bã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\81®å\80¤ã\82\92å\8f\96ã\82\8aã\80\81 ã\81\93ã\81®å\80¤ã\81«ã\82\88ã\82\8a
 \fIpid\fP がどのように解釈されるかが規定される。
 .RS
 .TP 
@@ -327,8 +435,8 @@ ID が \fIpid\fP で指定された値のプロセスグループにそのシグ
 .TP 
 \fBF_GETSIG\fP (\fIvoid\fP)
 入力や出力が可能になった場合に送るシグナルを (関数の結果として) 返す。 値ゼロは \fBSIGIO\fP を送ることを意味する。 (\fBSIGIO\fP
-を含む) 他の値はいずれも、 \fBSIGIO\fP の代わりに送るシグナル番号を表す。 後者の場合、シグナルハンドラを \fBSA_SIGINFO\fP
-フラグ付きで設定すれば、ハンドラで追加の情報を得ることができる。 \fIarg\fP は無視される。
\82\92å\90«ã\82\80) ä»\96ã\81®å\80¤ã\81¯ã\81\84ã\81\9aã\82\8cã\82\82ã\80\81 \fBSIGIO\fP ã\81®ä»£ã\82\8fã\82\8aã\81«é\80\81ã\82\8bã\82·ã\82°ã\83\8aã\83«ç\95ªå\8f·ã\82\92表ã\81\99ã\80\82 å¾\8cè\80\85ã\81®å ´å\90\88ã\80\81ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\82\92 \fBSA_SIGINFO\fP
\83\95ã\83©ã\82°ä»\98ã\81\8dã\81§è¨­å®\9aã\81\99ã\82\8cã\81°ã\80\81ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81§è¿½å\8a ã\81®æ\83\85å ±ã\82\92å¾\97ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\82\8bã\80\82 \fIarg\fP ã\81¯ç\84¡è¦\96ã\81\95ã\82\8cã\82\8bã\80\82
 .TP 
 \fBF_SETSIG\fP (\fIint\fP)
 .\"
@@ -342,19 +450,19 @@ ID が \fIpid\fP で指定された値のプロセスグループにそのシグ
 .\" .B F_SETOWN
 .\" for more details.
 入力や出力が可能になった場合に送るシグナルを \fIarg\fP に指定された値に設定する。 値ゼロは \fBSIGIO\fP を送ることを意味する。
-(\fBSIGIO\fP を含む) 他の値はいずれも、 \fBSIGIO\fP の代わりに送るシグナル番号を表す。 後者の場合、シグナルハンドラを
-\fBSA_SIGINFO\fP フラグ付きで設定すれば、 ハンドラで追加の情報を得ることができる。
+(\fBSIGIO\fP ã\82\92å\90«ã\82\80) ä»\96ã\81®å\80¤ã\81¯ã\81\84ã\81\9aã\82\8cã\82\82ã\80\81 \fBSIGIO\fP ã\81®ä»£ã\82\8fã\82\8aã\81«é\80\81ã\82\8bã\82·ã\82°ã\83\8aã\83«ç\95ªå\8f·ã\82\92表ã\81\99ã\80\82 å¾\8cè\80\85ã\81®å ´å\90\88ã\80\81ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\82\92
+\fBSA_SIGINFO\fP ã\83\95ã\83©ã\82°ä»\98ã\81\8dã\81§è¨­å®\9aã\81\99ã\82\8cã\81°ã\80\81 ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81§è¿½å\8a ã\81®æ\83\85å ±ã\82\92å¾\97ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\82\8bã\80\82
 
-\fBF_SETSIG\fP にゼロ以外の値を設定し、シグナルハンドラに \fBSA_SIGINFO\fP フラグを設定すると、 (\fBsigaction\fP(2)
-を参照) I/O イベントに関する追加の情報が \fIsiginfo_t\fP 構造体でシグナルハンドラへ渡される。 \fIsi_code\fP
+\fBF_SETSIG\fP ã\81«ã\82¼ã\83­ä»¥å¤\96ã\81®å\80¤ã\82\92設å®\9aã\81\97ã\80\81ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81« \fBSA_SIGINFO\fP ã\83\95ã\83©ã\82°ã\82\92設å®\9aã\81\99ã\82\8bã\81¨ã\80\81 (\fBsigaction\fP(2)
\82\92å\8f\82ç\85§) I/O ã\82¤ã\83\99ã\83³ã\83\88ã\81«é\96¢ã\81\99ã\82\8b追å\8a ã\81®æ\83\85å ±ã\81\8c \fIsiginfo_t\fP æ§\8bé\80 ä½\93ã\81§ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81¸æ¸¡ã\81\95ã\82\8cã\82\8bã\80\82 \fIsi_code\fP
 フィールドが示すシグナルの原因が \fBSI_SIGIO\fP である場合、 \fIsi_fd\fP
\83\95ã\82£ã\83¼ã\83«ã\83\89ã\81«ã\81¯ã\82¤ã\83\99ã\83³ã\83\88ã\81«å¯¾å¿\9cã\81\99ã\82\8bã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\81\8cå\85¥ã\81£ã\81¦ã\81\84ã\82\8bã\80\82 ã\81\9dã\82\8c以å¤\96ã\81®å ´å\90\88ã\81¯ã\80\81ã\81©ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿が利用可能かを示す情報は
-ないので、どのファイルディスクリプタで I/O が可能かを判断するためには 通常の機構 (\fBselect\fP(2), \fBpoll\fP(2),
\83\95ã\82£ã\83¼ã\83«ã\83\89ã\81«ã\81¯ã\82¤ã\83\99ã\83³ã\83\88ã\81«å¯¾å¿\9cã\81\99ã\82\8bã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8cå\85¥ã\81£ã\81¦ã\81\84ã\82\8bã\80\82 ã\81\9dã\82\8c以å¤\96ã\81®å ´å\90\88ã\81¯ã\80\81ã\81©ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼が利用可能かを示す情報は
\81ªã\81\84ã\81®ã\81§ã\80\81ã\81©ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81§ I/O ã\81\8cå\8f¯è\83½ã\81\8bã\82\92å\88¤æ\96­ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\81¯ é\80\9a常ã\81®æ©\9fæ§\8b (\fBselect\fP(2), \fBpoll\fP(2),
 \fBO_NONBLOCK\fP を設定した \fBread\fP(2)  など) を使用しなければならない。
 
 リアルタイムシグナル (値が \fBSIGRTMIN\fP 以上) を選択している場合は、 同じシグナル番号を持つ複数の I/O
-イベントがキューに入ることがある (キューに入れるかどうかは利用可能なメモリに依存している)。 上記と同様、 \fBSA_SIGINFO\fP
-が設定されている場合、シグナルハンドラのための追加の情報が得られる。
\82¤ã\83\99ã\83³ã\83\88ã\81\8cã\82­ã\83¥ã\83¼ã\81«å\85¥ã\82\8bã\81\93ã\81¨ã\81\8cã\81\82ã\82\8b (ã\82­ã\83¥ã\83¼ã\81«å\85¥ã\82\8cã\82\8bã\81\8bã\81©ã\81\86ã\81\8bã\81¯å\88©ç\94¨å\8f¯è\83½ã\81ªã\83¡ã\83¢ã\83ªã\83¼ã\81«ä¾\9då­\98ã\81\97ã\81¦ã\81\84ã\82\8b\80\82 ä¸\8aè¨\98ã\81¨å\90\8cæ§\98ã\80\81 \fBSA_SIGINFO\fP
\81\8c設å®\9aã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bå ´å\90\88ã\80\81ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81®ã\81\9fã\82\81ã\81®è¿½å\8a ã\81®æ\83\85å ±ã\81\8cå¾\97ã\82\89ã\82\8cã\82\8bã\80\82
 
 .\" See fs/fcntl.c::send_sigio_to_task() (2.4/2.6) sources -- MTK, Apr 05
 以下の点に注意すること。 Linux では一つのプロセスに対してキューに入れられるリアルタイム シグナルの数に上限が設けられており
@@ -364,15 +472,16 @@ ID が \fIpid\fP で指定された値のプロセスグループにそのシグ
 これらの機構を使用することで、ほとんどの場合で \fBselect\fP(2)  や \fBpoll\fP(2)  を使用せずに完全な非同期 I/O
 を実装することができる。
 .PP
-\fBO_ASYNC\fP, \fBF_GETOWN\fP, \fBF_SETOWN\fP の使用は BSD と Linux に特有である。
-\fBF_GETOWN_EX\fP, \fBF_SETOWN_EX\fP, \fBF_GETSIG\fP, \fBF_SETSIG\fP は Linux 固有である。POSIX
-には、同様のことを行うために、非同期 I/O と \fIaio_sigevent\fP 構造体がある。Linux では、GNU C ライブラリ (Glibc)
-の一部として これらも利用可能である。
+\fBO_ASYNC\fP の使用方法は BSD と Linux に特有である。 POSIX.1 で規定されている \fBF_GETOWN\fP と
+\fBF_SETOWN\fP の使用方法は、ソケットに対する \fBSIGURG\fP シグナルとの組み合わせだけである (POSIX は \fBSIGIO\fP
+シグナルは規定していない)。 \fBF_GETOWN_EX\fP, \fBF_SETOWN_EX\fP, \fBF_GETSIG\fP, \fBF_SETSIG\fP は
+Linux 固有である。POSIX には、同様のことを行うために、非同期 I/O と \fIaio_sigevent\fP 構造体がある。Linux
+では、GNU C ライブラリ (Glibc) の一部として これらも利用可能である。
 .SS "リース (leases)"
 (Linix 2.4 以降で利用可能)  \fBF_SETLEASE\fP は、 \fIfd\fP
 が参照するオープンファイル記述に対して新しいリースを設定するのに使用される。 \fBF_GETLEASE\fP は、 \fIfd\fP
 が参照するオープンファイル記述に対して設定されている 現在のリースを取得するのに使用される。 ファイルのリースにより、 あるプロセス ("lease
-breaker") がそのファイルディスクリプタが参照 しているファイルに対して \fBopen\fP(2)  や \fBtruncate\fP(2)
+breaker") ã\81\8cã\81\9dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8cå\8f\82ç\85§ ã\81\97ã\81¦ã\81\84ã\82\8bã\83\95ã\82¡ã\82¤ã\83«ã\81«å¯¾ã\81\97ã\81¦ \fBopen\fP(2)  ã\82\84 \fBtruncate\fP(2)
 を行おうとした際に、リースを保持しているプロセス ("lease holder") へ (シグナルの配送による) 通知が行われるという機構が提供される。
 .TP 
 \fBF_SETLEASE\fP (\fIint\fP)
@@ -384,30 +493,31 @@ breaker") がそのファイルディスクリプタが参照 しているファ
 .\" See the man-pages-2.09 Changelog for further info.
 読み出しリースを取得する。これにより、 そのファイルが書き込み用にオープンされたり、ファイルが切り詰められた場合に、
 呼び出し元のプロセスに通知が行われるようになる。 読み出しリースを設定できるのは、読み出し専用でオープンされている
-ファイルディスクリプタに対してのみである。
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«å¯¾ã\81\97ã\81¦ã\81®ã\81¿ã\81§ã\81\82ã\82\8bã\80\82
 .TP 
 \fBF_WRLCK\fP
 書き込みリースを取得する。これにより、 (読み出し用か書き込み用にかかわらず) そのファイルがオープンされたり、
 ファイルが切り詰められた場合に、呼び出し元のプロセスに通知が行われるようになる。
-書き込みリースは、そのファイルに対するオープンされたファイルディスクリプタが 他にない場合にのみ設定できる。
\9b¸ã\81\8dè¾¼ã\81¿ã\83ªã\83¼ã\82¹ã\81¯ã\80\81ã\81\9dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81«å¯¾ã\81\99ã\82\8bã\82ªã\83¼ã\83\97ã\83³ã\81\95ã\82\8cã\81\9fã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8c ä»\96ã\81«ã\81ªã\81\84å ´å\90\88ã\81«ã\81®ã\81¿è¨­å®\9aã\81§ã\81\8dã\82\8bã\80\82
 .TP 
 \fBF_UNLCK\fP
 そのファイルからリースを削除する。
 .RE
 .P
 リースはオープンファイル記述に対して関連付けられる (\fBopen\fP(2)  参照)。 つまり、 (\fBfork\fP(2)  や \fBdup\fP(2)
\81ªã\81©ã\81«ã\82\88ã\82\8aä½\9cæ\88\90ã\81\95ã\82\8cã\81\9f) ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\81®è¤\87製ã\81¯å\90\8cã\81\98ã\83ªã\83¼ã\82¹ã\82\92å\8f\82ç\85§ã\81\97ã\80\81 è¤\87製ã\82\82å\90«ã\82\81ã\81\9fã\81©ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿を使ってもこのリースを変更したり
-解放したりできる。 また、これらのファイルディスクリプタのいずれかに対して \fBF_UNLCK\fP
-操作が明示的に実行された場合や、すべてのファイルディスクリプタが 閉じられた場合にも、リースは解放される。
\81ªã\81©ã\81«ã\82\88ã\82\8aä½\9cæ\88\90ã\81\95ã\82\8cã\81\9f) ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81®è¤\87製ã\81¯å\90\8cã\81\98ã\83ªã\83¼ã\82¹ã\82\92å\8f\82ç\85§ã\81\97ã\80\81 è¤\87製ã\82\82å\90«ã\82\81ã\81\9fã\81©ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼を使ってもこのリースを変更したり
+解æ\94¾ã\81\97ã\81\9fã\82\8aã\81§ã\81\8dã\82\8bã\80\82 ã\81¾ã\81\9fã\80\81ã\81\93ã\82\8cã\82\89ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\81«å¯¾ã\81\97ã\81¦ \fBF_UNLCK\fP
\93\8dä½\9cã\81\8cæ\98\8e示ç\9a\84ã\81«å®\9fè¡\8cã\81\95ã\82\8cã\81\9få ´å\90\88ã\82\84ã\80\81ã\81\99ã\81¹ã\81¦ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8c é\96\89ã\81\98ã\82\89ã\82\8cã\81\9få ´å\90\88ã\81«ã\82\82ã\80\81ã\83ªã\83¼ã\82¹ã\81¯è§£æ\94¾ã\81\95ã\82\8cã\82\8bã\80\82
 .P
 リースの取得は通常のファイル (regular file) に対してのみ可能である。 非特権プロセスがリースを取得できるのは、UID (所有者)
 がプロセスの ファイルシステム UID と一致するファイルに対してだけである。 \fBCAP_LEASE\fP
 ケーパビリティを持つプロセスは任意のファイルに対してリースを取得できる。
 .TP 
 \fBF_GETLEASE\fP (\fIvoid\fP)
-ファイルディスクリプタ \fIfd\fP に対して設定されているリースの種別を取得する。 \fBF_RDLCK\fP, \fBF_WRLCK\fP, \fBF_UNLCK\fP
-のいずれかが返される。 \fBF_RDLCK\fP, \fBF_WRLCK\fP はそれぞれ、読み出しリース、書き込みリースが設定されていることを示し、
-\fBF_UNLCK\fP はリースが何も設定されていないことを示す。 \fIarg\fP は無視される。
+ファイルディスクリプター \fIfd\fP に対して設定されているリースの種別を取得する。 \fBF_RDLCK\fP, \fBF_WRLCK\fP,
+\fBF_UNLCK\fP のいずれかが返される。 \fBF_RDLCK\fP, \fBF_WRLCK\fP
+はそれぞれ、読み出しリース、書き込みリースが設定されていることを示し、 \fBF_UNLCK\fP はリースが何も設定されていないことを示す。 \fIarg\fP
+は無視される。
 .PP
 あるプロセス ("lease breaker") が \fBF_SETLEASE\fP で設定されたリースと矛
 盾するような \fBopen\fP(2) や \fBtruncate\fP(2) を実行した場合、 そのシステム
@@ -415,7 +525,7 @@ breaker") がそのファイルディスクリプタが参照 しているファ
 (デフォルトでは \fBSIGIO\fP) を送って通知を行う。 lease holder はこのシグ
 ナルを受信したときにはきちんと対応すべきである。 具体的には、別のプロセ
 スがそのファイルにアクセスするための準備として 必要な後片付け (例えば、
-キャッシュされたバッファのフラッシュ) を すべて行ってから、そのファイル
\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\95ã\82\8cã\81\9fã\83\90ã\83\83ã\83\95ã\82¡ã\83¼ã\81®ã\83\95ã\83©ã\83\83ã\82·ã\83¥) ã\82\92 ã\81\99ã\81¹ã\81¦è¡\8cã\81£ã\81¦ã\81\8bã\82\89ã\80\81ã\81\9dã\81®ã\83\95ã\82¡ã\82¤ã\83«
 のリースの削除または格下げを行う。リースを削除をするには、 \fIarg\fP に
 \fBF_UNLCK\fP を指定して \fBF_SETLEASE\fP を実行する。lease holder がファイル
 に書き込みリースを保持していて、 lease breaker が読み出し用にそのファイ
@@ -423,8 +533,9 @@ breaker") がそのファイルディスクリプタが参照 しているファ
 リースに格下げすれば 十分である。これをするには、 \fIarg\fP に \fBF_RDLCK\fP
 を指定して \fBF_SETLEASE\fP を実行する。
 
-lease holder が \fI/proc/sys/fs/lease\-break\-time\fP
-で指定された秒数以内にリースの格下げか削除を行えなかった場合、 カーネルは強制的にその lease holder のリースを削除もしくは格下げを行う。
+If the lease holder fails to downgrade or remove the lease within the number
+of seconds specified in \fI/proc/sys/fs/lease\-break\-time\fP, then the kernel
+forcibly removes or downgrades the lease holder's lease.
 
 いったん lease break が開始されると、 lease holder が自発的にそのリース
 の格下げか削除を行うか、lease break timer の満了後にカーネルが強制的に
@@ -435,7 +546,7 @@ breaker と互換性のある型となる)。
 一度リースの削除か格下げが自発的もしくは強制的に行われると、 lease breaker がまだシステムコールを再開していない場合には、 カーネルが
 lease breaker のシステムコールの続行を許可する。
 
-lease breaker が実行した \fBopen\fP(2)  や \fBtruncate\fP(2)  が停止中にシグナルハンドラにより中断された場合、
+lease breaker ã\81\8cå®\9fè¡\8cã\81\97ã\81\9f \fBopen\fP(2)  ã\82\84 \fBtruncate\fP(2)  ã\81\8cå\81\9c止中ã\81«ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81«ã\82\88ã\82\8a中æ\96­ã\81\95ã\82\8cã\81\9få ´å\90\88ã\80\81
 そのシステムコールは \fBEINTR\fP エラーで失敗するが、上で述べた他の処理は そのまま行われる。 \fBopen\fP(2)  や
 \fBtruncate\fP(2)  が停止中に lease breaker がシグナルにより kill された場合、 上で述べた他の処理はそのまま行われる。
 lease breaker が \fBopen\fP(2)  を呼ぶ際に \fBO_NONBLOCK\fP フラグを指定した場合、そのシステムコールは
@@ -443,8 +554,8 @@ lease breaker が \fBopen\fP(2)  を呼ぶ際に \fBO_NONBLOCK\fP フラグを
 
 lease holder への通知に使われるデフォルトのシグナルは \fBSIGIO\fP だが、 \fBfcntl\fP()  の \fBF_SETSIG\fP
 コマンドで変更することができる。 \fBF_SETSIG\fP コマンドが実行され (\fBSIGIO\fP を指定された場合も含む)、 \fBSA_SIGINFO\fP
\83\95ã\83©ã\82°ä»\98ã\81\8dã\81§ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\81\8c設å®\9aã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81«ã\81¯ã\80\81 ã\83\8fã\83³ã\83\89ã\83©の第二引き数として \fIsiginfo_t\fP 構造体が渡され、この引き数の
-\fIsi_fd\fP フィールドには別のプロセスがアクセスしたリース設定済みファイルの ディスクリプタが入っている
\83\95ã\83©ã\82°ä»\98ã\81\8dã\81§ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81\8c設å®\9aã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81«ã\81¯ã\80\81 ã\83\8fã\83³ã\83\89ã\83©ã\83¼の第二引き数として \fIsiginfo_t\fP 構造体が渡され、この引き数の
+\fIsi_fd\fP ã\83\95ã\82£ã\83¼ã\83«ã\83\89ã\81«ã\81¯å\88¥ã\81®ã\83\97ã\83­ã\82»ã\82¹ã\81\8cã\82¢ã\82¯ã\82»ã\82¹ã\81\97ã\81\9fã\83ªã\83¼ã\82¹è¨­å®\9aæ¸\88ã\81¿ã\83\95ã\82¡ã\82¤ã\83«ã\81® ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8cå\85¥ã\81£ã\81¦ã\81\84ã\82\8b
 (この機能は複数のファイルに対してリースを設定する場合に有用である)。
 .SS "ファイルやディレクトリの変更の通知 (dnotify)"
 .TP 
@@ -456,26 +567,29 @@ lease holder への通知に使われるデフォルトのシグナルは \fBSIG
 .PD 0
 .TP  12
 \fBDN_ACCESS\fP
-ファイルへのアクセスがあった (read, pread, readv)
+ファイルへのアクセスがあった (\fBread\fP(2), \fBpread\fP(2), \fBreadv\fP(2) や同様のシステムコール)
 .TP 
 \fBDN_MODIFY\fP
-ファイルの内容が変更された (write, pwrite, writev, truncate, ftruncate).
+ファイルの内容が変更された (\fBwrite\fP(2), \fBpwrite\fP(2), \fBwritev\fP(2), \fBtruncate\fP(2),
+\fBftruncate\fP(2) や同様のシステムコール)
 .TP 
 \fBDN_CREATE\fP
-ファイルが作成された (open, creat, mknod, mkdir, link, symlink, rename).
+ファイルが作成された (\fBopen\fP(2), \fBcreat\fP(2), \fBmknod\fP(2), \fBmkdir\fP(2), "
+"\fBlink\fP(2), \fBsymlink\fP(2), このディレクトリへの \fBrename\fP(2))
 .TP 
 \fBDN_DELETE\fP
-ファイルが削除 (unlink) された (unlink, 別のディレクトリへの rename, rmdir)
+ファイルが削除 (unlink) された (\fBunlink\fP(2), 別のディレクトリへの \fBrename\fP(2), \fBrmdir\fP(2))
 .TP 
 \fBDN_RENAME\fP
-ディレクトリ内でのファイル名の変更があった (rename)
+ディレクトリ内でのファイル名の変更があった (\fBrename\fP(2))
 .TP 
 \fBDN_ATTRIB\fP
-ファイル属性が変更された (chown, chmod, utime[s])
+ファイル属性が変更された (\fBchown\fP(2), \fBchmod\fP(2), \fButime\fP(2), \fButimensat\fP(2)
+や同様のシステムコール)
 .PD
 .RE
 .IP
-(上記の定義を利用するには、\fIどの\fP ヘッダファイルをインクルードするより前に、
+(ä¸\8aè¨\98ã\81®å®\9a義ã\82\92å\88©ç\94¨ã\81\99ã\82\8bã\81«ã\81¯ã\80\81\fIã\81©ã\81®\fP ã\83\98ã\83\83ã\83\80ã\83¼ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\82¤ã\83³ã\82¯ã\83«ã\83¼ã\83\89ã\81\99ã\82\8bã\82\88ã\82\8aå\89\8dã\81«ã\80\81
 \fB_GNU_SOURCE\fP 機能検査マクロを定義しなければならない。)
 
 ディレクトリの変更通知は通常「一回限り (one\-shot)」であり、 アプリケーション側でその後さらに通知を受信したい場合は
@@ -487,15 +601,17 @@ lease holder への通知に使われるデフォルトのシグナルは \fBSIG
 すべてのイベントの通知を無効にするには、 \fIarg\fP に 0 を指定して \fBF_NOTIFY\fP を呼び出す必要がある。
 
 通知はシグナルの配送で行われる。 デフォルトのシグナルは \fBSIGIO\fP だが、 \fBfcntl\fP()  の \fBF_SETSIG\fP
-コマンドで変更することができる。 後者の場合には、 (\fBSA_SIGINFO\fP フラグ付きでシグナルハンドラが設定されている場合には)
-ハンドラの第二引き数として \fIsiginfo_t\fP 構造体が渡され、この構造体の \fIsi_fd\fP
-フィールドには通知の行われたファイルディスクリプタが入っている (この機能は複数のディレクトリに対して通知を設定する場合に有用である)。
+コマンドで変更することができる。 (\fBSIGIO\fP はキューイングされない標準のシグナルの一つである点に注意。
+リアルタイムシグナルを使うように変更すると、 複数の通知がそのプロセス宛のキューに入ることがあることを意味する。) 後者の場合には、
+(\fBSA_SIGINFO\fP フラグ付きでシグナルハンドラーが設定されている場合には)  ハンドラーの第二引き数として \fIsiginfo_t\fP
+構造体が渡され、この構造体の \fIsi_fd\fP フィールドには通知の行われたファイルディスクリプターが入っている
+(この機能は複数のディレクトリに対して通知を設定する場合に有用である)。
 
 特に \fBDN_MULTISHOT\fP を使う場合は、通知にはリアルタイムシグナルを使うべきである。
 それは、リアルタイムシグナルを使うことで、複数の通知をキューに入れる ことができるからである。
 
 \fB注意:\fP 新しくアプリケーションを書く際には、(カーネル 2.6.13 以降で利用可能となった)  \fIinotify\fP
\82¤ã\83³ã\82¿ã\83\95ã\82§ã\83¼ã\82¹ã\82\92使ç\94¨ã\81\99ã\81¹ã\81\8dã\81§ã\81\82ã\82\8bã\80\82 \fIinotify\fP ã\81¯ã\83\95ã\82¡ã\82¤ã\83«ã\82·ã\82¹ã\83\86ã\83 ã\82¤ã\83\99ã\83³ã\83\88ã\81®é\80\9aç\9f¥ã\82\92å\8f\96å¾\97ã\81\99ã\82\8bã\81\9fã\82\81ã\81® ã\81\9aã\81£ã\81¨å\84ªã\82\8cã\81\9fã\82¤ã\83³ã\82¿フェースである。
\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\83¼ã\82¹ã\82\92使ç\94¨ã\81\99ã\81¹ã\81\8dã\81§ã\81\82ã\82\8bã\80\82 \fIinotify\fP ã\81¯ã\83\95ã\82¡ã\82¤ã\83«ã\82·ã\82¹ã\83\86ã\83 ã\82¤ã\83\99ã\83³ã\83\88ã\81®é\80\9aç\9f¥ã\82\92å\8f\96å¾\97ã\81\99ã\82\8bã\81\9fã\82\81ã\81® ã\81\9aã\81£ã\81¨å\84ªã\82\8cã\81\9fã\82¤ã\83³ã\82¿ã\83¼フェースである。
 \fBinotify\fP(7)  を参照。
 .SS パイプの容量の変更
 .TP 
@@ -510,38 +626,103 @@ lease holder への通知に使われるデフォルトのシグナルは \fBSIG
 された上限より大きな値に設定しようとした場合は、エラー \fBEPERM\fP が
 発生する。特権プロセス (\fBCAP_SYS_RESOURCE\fP ケーパビリティを持つ
 プロセス) はこの上限を上書きできる。
-パイプにバッファを割り当てる場合、実装側の都合に応じて、
\83\91ã\82¤ã\83\97ã\81«ã\83\90ã\83\83ã\83\95ã\82¡ã\83¼ã\82\92å\89²ã\82\8aå½\93ã\81¦ã\82\8bå ´å\90\88ã\80\81å®\9fè£\85å\81´ã\81®é\83½å\90\88ã\81«å¿\9cã\81\98ã\81¦ã\80\81
 カーネルは \fIarg\fP よりも大きな容量を割り当ててもよい。
-\fBF_GETPIPE_SZ\fP 操作では実際に使用されている大きさが返される。
-パイプの容量を現在データを格納するのに使用されているバッファの
+実際に設定された大きさが関数の返り値として返される。
\83\91ã\82¤ã\83\97ã\81®å®¹é\87\8fã\82\92ç\8f¾å\9c¨ã\83\87ã\83¼ã\82¿ã\82\92æ ¼ç´\8dã\81\99ã\82\8bã\81®ã\81«ä½¿ç\94¨ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\90ã\83\83ã\83\95ã\82¡ã\83¼ã\81®
 サイズよりも小さくしようとした場合は、エラー \fBEBUSY\fP が発生する。
 .TP 
 \fBF_GETPIPE_SZ\fP (\fIvoid\fP; Linux 2.6.35 以降)
+.\"
 \fIfd\fP が参照するパイプの容量を (関数の結果として) 返す。
+.SS "File Sealing"
+file seal は指定されたファイルで許可される操作の集合を制限する。 ファイルに設定される seal 毎に対応する操作の集合が規定されており、
+それ以降のそのファイルに対する対応する操作は \fBEPERM\fP で失敗する。 このようなファイルは sealed (seal が適用されている)
+と呼ばれる。 デフォルトの seal の集合は、適用されるファイルやファイルシステムに依存する。 file seal の概要、 その目的、
+サンプルコードについては \fBmemfd_create\fP(2) を参照。
+
+現在のところ \fItmpfs\fP ファイルシステムだけが sealing をサポートしている。 他のファイルシステムでは、 seal に関連する
+\fBfcntl\fP(2) の操作はすべて \fBEINVAL\fP を返す。
+
+seal は inode の属性である。 したがって、 同じ inode を参照するすべてのオープンされたファイルディスクリプターは、 同じ seal
+の集合を共有する。 さらに、 seal は削除することはできず、 追加のみ可能である。
+.TP 
+\fBF_ADD_SEALS\fP (\fIint\fP; Linux 3.17 以降)
+ビットマスク引き数 \fIarg\fP で指定された seal を、 ファイルディスクリプター \fIfd\fP が参照する inode の seal
+の集合に追加する。 一度追加した seal を削除することはできない。 この呼び出しが成功すると、 seal はただちにカーネルにより適用される。
+現在の seal の集合に \fBF_SEAL_SEAL\fP (下記参照) が含まれている場合、 この呼び出しは \fBEPERM\fP で拒否される。
+すでに設定されている seal を追加した場合、 \fBF_SEAL_SEAL\fP がまだ設定されていない場合は no\-op (何もしない) となる。
+seal を設定するには、 ファイルディスクリプター \fIfd\fP が書き込み可能でなければならない。
+.TP 
+\fBF_GET_SEALS\fP (\fIvoid\fP; Linux 3.17 以降)
+(関数の結果として) \fIfd\fP が参照する inode の seal の現在の集合を返す。 seal が何も設定されていない場合、 0 が返される。
+ファイルが sealing をサポートしていない場合、 \-1 が返され、 \fIerrno\fP に \fBEINVAL\fP が設定される。
+.PP
+以下の seal が利用できる。
+.TP 
+\fBF_SEAL_SEAL\fP
+この seal が設定されると、  これ以降の \fBF_ADD_SEALS\fP を指定した \fBfcntl\fP(2) の呼び出しはすべて \fBEPERM\fP
+で失敗する。 したがって、 この seal を設定すると seal の集合自身の変更を防止できる。 ファイルの最初の seal の集合に
+\fBF_SEAL_SEAL\fP が含まれていた場合、 結果的に seal の集合が定数になりロックされることになる。
+.TP 
+\fBF_SEAL_SHRINK\fP
+この seal が設定されると、 設定されたファイルのサイズを小さくできなくなる。 この seal は \fBopen\fP(2) の \fBO_TRUNC\fP
+フラグに影響する。 \fBtruncate\fP(2) と \fBftruncate\fP(2) についても同様である。
+対象のファイルのサイズを小さくしようとした場合、 これらの呼び出しは \fBEPERM\fP で失敗する。
+ファイルサイズを増やすことはこの場合でも可能である。
+.TP 
+\fBF_SEAL_GROW\fP
+この seal が設定されると、 設定されたファイルのサイズを増やせなくなる。 この seal はファイルの末尾を超えての \fBwrite\fP(2) や
+\fBtruncate\fP(2), \fBftruncate\fP(2), \fBfallocate\fP(2) に影響する。
+対象のファイルのサイズを大きくしようとした場合、 これらの呼び出しは \fBEPERM\fP で失敗する。 ファイルサイズが変わらない場合、
+小さくなる場合は、 これらの呼び出しはそのまま動作する。
+.TP 
+\fBF_SEAL_WRITE\fP
+.\" One or more other seals are typically used with F_SEAL_WRITE
+.\" because, given a file with the F_SEAL_WRITE seal set, then,
+.\" while it would no longer be possinle to (say) write zeros into
+.\" the last 100 bytes of a file, it would still be possible
+.\" to (say) shrink the file by 100 bytes using ftruncate(), and
+.\" then increase the file size by 100 bytes, which would have
+.\" the effect of replacing the last hundred bytes by zeros.
+.\"
+この seal が設定されていると、 ファイルの内容を変更できない。 ファイルのサイズを縮小したり伸張したりすることは可能で許可されている。
+したがって、 この seal は通常は他の seal のいずれかと組み合わせて使用される。 この seal は \fBwrite\fP(2) と
+\fBfallocate\fP(2) (\fBFALLOC_FL_PUNCH_HOLE\fP フラグとの組み合わせの場合のみ) に影響する。 この seal
+が設定されると、 これらの呼び出しは \fBEPERM\fP で失敗する。 また、 \fBmmap\fP(2)
+による新しい書き込み可能な共有メモリーマッピングの作成も \fBEPERM\fP で失敗する。
+
+\fBfcntl\fP(2) の \fBF_ADD_SEALS\fP で \fBF_SEAL_WRITE\fP を設定しようとした場合、
+書き込み可能な共有マッピングが存在すると \fBEBUSY\fP で失敗する。 このようなマッピングは、 この seal
+を追加する前にアンマップしなければならない。 また、 ファイルに対して処理待ちの非同期 I/O 操作 (\fBio_submit\fP(2) がある場合、
+処理されていない書き込みは破棄される。
 .SH 返り値
 成功した場合の返り値は操作の種類により違う:
 .TP  0.9i
 \fBF_DUPFD\fP
-新しいディスクリプタを返す。
\96°ã\81\97ã\81\84ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\82\92è¿\94ã\81\99ã\80\82
 .TP 
 \fBF_GETFD\fP
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83»フラグの値
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼フラグの値
 .TP 
 \fBF_GETFL\fP
 ファイル状態フラグの値
 .TP 
 \fBF_GETLEASE\fP
-ファイルディスクリプタに対して保持されているリースの種別を返す。
\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81«å¯¾ã\81\97ã\81¦ä¿\9dæ\8c\81ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83ªã\83¼ã\82¹ã\81®ç¨®å\88¥ã\82\92è¿\94ã\81\99ã\80\82
 .TP 
 \fBF_GETOWN\fP
-ディスクリプタの所有者を返す。
\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81®æ\89\80æ\9c\89è\80\85ã\82\92è¿\94ã\81\99ã\80\82
 .TP 
 \fBF_GETSIG\fP
 読み込みや書き出しが可能になった時に送られるシグナルの値、もしくは 伝統的な \fBSIGIO\fP 動作の場合にはゼロを返す。
 .TP 
-\fBF_GETPIPE_SZ\fP
+\fBF_GETPIPE_SZ\fP, \fBF_SETPIPE_SZ\fP
 パイプの容量。
 .TP 
+\fBF_GET_SEALS\fP
+\fIfd\fP が参照する inode に設定されている seal を示すビットマスク。
+.TP 
 他の全てのコマンド
 0 を返す。
 .PP
@@ -552,11 +733,22 @@ lease holder への通知に使われるデフォルトのシグナルは \fBSIG
 他のプロセスが保持しているロックによって操作が禁止されている。
 .TP 
 \fBEAGAIN\fP
\81\9dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯ä»\96ã\81®ã\83\97ã\83­ã\82»ã\82¹ã\81«ã\82\88ã\81£ã\81¦ã\83¡ã\83¢ã\83ªã\83»マップされているため、 操作が禁止されている。
\81\9dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯ä»\96ã\81®ã\83\97ã\83­ã\82»ã\82¹ã\81«ã\82\88ã\81£ã\81¦ã\83¡ã\83¢ã\83ªã\83¼マップされているため、 操作が禁止されている。
 .TP 
 \fBEBADF\fP
-\fIfd\fP がオープンされたファイルディスクリプタでない。 あるいはコマンドが \fBF_SETLK\fP または \fBF_SETLKW\fP
-だったが、対象のファイルディスクリプタのオープンモードが 必要となるロックの型にマッチしていない。
+\fIfd\fP がオープンされたファイルディスクリプターではない。
+.TP 
+\fBEBADF\fP
+\fIcmd\fP が \fBF_SETLK\fP または \fBF_SETLKW\fP だったが、対象のファイルディスクリプターのオープンモードが
+必要となるロックの型にマッチしていない。
+.TP 
+\fBEBUSY\fP
+\fIcmd\fP が \fBF_SETPIPE_SZ\fP で、 \fIarg\fP で指定されたパイプの新しい容量がパイプが、
+現在パイプにあるデータを格納するのに使用されているバッファー容量よりも小さい。
+.TP 
+\fBEBUSY\fP
+\fIcmd\fP が \fBF_ADD_SEALS\fP で、 \fIarg\fP に \fBF_SEAL_WRITE\fP が含まれており、 \fIfd\fP
+が参照するファイルに対する書き込み可能な共有マッピングが存在する。
 .TP 
 \fBEDEADLK\fP
 指定された \fBF_SETLKW\fP コマンドを実行した場合にはデッドロックになることが検出された。
@@ -565,32 +757,60 @@ lease holder への通知に使われるデフォルトのシグナルは \fBSIG
 \fIlock\fP が利用可能なアドレス空間の外部にある。
 .TP 
 \fBEINTR\fP
-\fBF_SETLKW\fP コマンドがシグナルにより割り込まれた (\fBsignal\fP(7)  参照)。 \fBF_GETLK\fP と \fBF_SETLK\fP
+\fIcmd\fP が \fBF_SETLKW\fP か \fBF_OFD_SETLKW\fP で、 操作がシグナルにより割り込まれた。 \fBsignal\fP(7)
+参照。
+.TP 
+\fBEINTR\fP
+\fIcmd\fP が \fBF_GETLK\fP, \fBF_SETLK\fP, \fBF_OFD_GETLK\fP, \fBF_OFD_SETLK\fP で、
+操作がシグナルにより割り込まれた (\fBsignal\fP(7)  参照)。 \fBF_GETLK\fP と \fBF_SETLK\fP
 の場合、ロックを確認したり取得したりする前にシグナルによって割り込まれた。 これはたいていリモートのファイルをロックする場合 (例えば NFS
 上でロックする場合) に起こる。 しかしローカルでも起こる場合がある。
 .TP 
 \fBEINVAL\fP
-\fBF_DUPFD\fPで、 \fIarg\fP が負か、もしくは許される最大値よりも大きい。 \fBF_SETSIG\fP の場合、 \fIarg\fP
-が利用可能なシグナル番号ではない。
+カーネルが認識しない値が \fIcmd\fP で指定された。
+.TP 
+\fBEINVAL\fP
+\fIcmd\fP が \fBF_ADD_SEALS\fP で、 \fIarg\fP に認識できない seal を示すビットが含まれている。
+.TP 
+\fBEINVAL\fP
+\fIcmd\fP が \fBF_ADD_SEALS\fP か \fBF_GET_SEALS\fP で、 \fIfd\fP が参照している inode
+が格納されているファイルシステムが sealing をサポートしていない。
+.TP 
+\fBEINVAL\fP
+\fIcmd\fP が \fBF_DUPFD\fP で、 \fIarg\fP が負か、もしくは許される最大値よりも大きい (\fBgetrlimit\fP(2) の
+\fBRLIMIT_NOFILE\fP の議論を参照)。
+.TP 
+\fBEINVAL\fP
+\fIcmd\fP が \fBF_SETSIG\fP で、 \fIarg\fP が許可されたシグナル番号ではない。
+.TP 
+\fBEINVAL\fP
+\fIcmd\fP が \fBF_OFD_SETLK\fP, \fBF_OFD_SETLKW\fP, \fBF_OFD_GETLK\fP のいずれかで、 \fIl_pid\fP に
+0 が指定されなかった。
 .TP 
 \fBEMFILE\fP
-\fBF_DUPFD\fPで、 プロセスがすでに最大数までファイルディスクリプタをオープンしている。
+\fIcmd\fP が \fBF_DUPFD\fPで、 プロセスがすでに最大数までファイルディスクリプターをオープンしている。
 .TP 
 \fBENOLCK\fP
\82ªã\83¼ã\83\97ã\83³ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83­ã\83\83ã\82¯ã\81®æ\95°ã\81\8cå¤\9aé\81\8eã\81\8eã\81¦ã\80\81ã\83­ã\83\83ã\82¯ã\83»ã\83\86ã\83¼ã\83\96ã\83«ã\81\8cã\81\84ã\81£ã\81±ã\81\84ã\81§ã\81\82ã\82\8bã\80\82 ã\81¾ã\81\9fã\81¯ remote locking protocol (ä¾\8bã\81\88ã\81° NFS
+オープンされているロックの数が多過ぎて、ロックテーブルがいっぱいである。 または remote locking protocol (例えば NFS
 上のロック) が失敗した。
 .TP 
+\fBENOTDIR\fP
+\fBF_NOTIFY\fP が \fIcmd\fP に指定されたが、 \fIfd\fP がディレクトリを参照していない。
+.TP 
 \fBEPERM\fP
 追加専用属性が設定されたファイルの \fBO_APPEND\fP フラグをクリアしようと試みた。
+.TP 
+\fBEPERM\fP
+\fIcmd\fP が \fBF_ADD_SEALS\fP だが、 \fIfd\fP が書き込み用にオープンされていないか、 ファイルの現在の seal の集合にすでに
+\fBF_SEAL_SEAL\fP が含まれている。
 .SH 準拠
 SVr4, 4.3BSD, POSIX.1\-2001.  POSIX.1\-2001 で規定されている操作は、
 \fBF_DUPFD\fP, \fBF_GETFD\fP, \fBF_SETFD\fP, \fBF_GETFL\fP, \fBF_SETFL\fP,
 \fBF_GETLK\fP, \fBF_SETLK\fP, \fBF_SETLKW\fP だけである。
 
-\fBF_GETOWN\fP と \fBF_SETOWN\fP は POSIX.1\-2001 で規定されている。
-(これら定義するには、 \fBBSD_SOURCE\fP を定義するか、
-\fB_XOPEN_SOURCE\fP を 500 以上の値で定義するか、
-\fB_POSIX_C_SOURCE\fP を 200809L 以上の値で定義すること。)
+\fBF_GETOWN\fP と \fBF_SETOWN\fP は POSIX.1\-2001 で規定されている。 (これら定義するには、
+\fB_BSD_SOURCE\fP を定義するか、 \fB_XOPEN_SOURCE\fP を 500 以上の値で定義するか、 \fB_POSIX_C_SOURCE\fP
+を 200809L 以上の値で定義するか、 のいずれが必要である。)
 
 \fBF_DUPFD_CLOEXEC\fP は POSIX.1\-2008 で規定されている。
 (これら定義するには、
@@ -603,7 +823,16 @@ SVr4, 4.3BSD, POSIX.1\-2001.  POSIX.1\-2001 で規定されている操作は、
 \fBF_GETSIG\fP,
 \fBF_SETSIG\fP, \fBF_NOTIFY\fP, \fBF_GETLEASE\fP, \fBF_SETLEASE\fP は Linux 固有である
 (これらの定義を有効にするには \fB_GNU_SOURCE\fP マクロを定義すること)。
+
+\fBF_OFD_SETLK\fP, \fBF_OFD_SETLKW\fP, \fBF_OFD_GETLK\fP は Linux 固有だが (これらの定義を得るには
+\fB_GNU_SOURCE\fP を定義しなければならない)、 POSIX.1 の次のバージョンに含めようという活動が進められている。
+
+.\" FIXME . Once glibc adds support, add a note about FTM requirements
+\fBF_ADD_SEALS\fP と \fBF_GET_SEALS\fP は Linux 固有である。
 .SH 注意
+.\"
+エラーの際の返り値が \fBdup2\fP(2)  と \fBF_DUPFD\fP では異なっている。
+.SS ファイルロック
 元々の Linux の \fBfcntl\fP() システムコールは (\fIflock\fP 構造体で) 大きな
 ファイルオフセットを扱えるように設計されていなかった。
 その結果、Linux 2.4 で \fBfcntl64\fP() システムコールが追加された。
@@ -615,21 +844,68 @@ SVr4, 4.3BSD, POSIX.1\-2001.  POSIX.1\-2001 で規定されている操作は、
 利用できる場合はそれを利用するようになっているからである。
 
 エラーの際の返り値が \fBdup2\fP(2)  と \fBF_DUPFD\fP では異なっている。
-
+.SS レコードロック
 カーネル 2.0 以降では、 \fBflock\fP(2)  と \fBfcntl\fP()  が設定するロック種別の間に相互作用はない。
 
 .\" e.g., Solaris 8 documents this field in fcntl(2), and Irix 6.5
 .\" documents it in fcntl(5).  mtk, May 2007
+.\" Also, FreeBSD documents it (Apr 2014).
 システムによっては、 \fIstruct flock\fP に上記以外のフィールドがあるものもある (例えば \fIl_sysid\fP)。
 はっきりと言えることは、ロックを保持しているプロセスが別のマシンに存在 する場合には、 \fIl_pid\fP
 だけはあまり役にたたないだろうということである。
+
+元々の Linux の \fBfcntl\fP() システムコールは (\fIflock\fP 構造体で) 大きな
+ファイルオフセットを扱えるように設計されていなかった。
+その結果、Linux 2.4 で \fBfcntl64\fP() システムコールが追加された。
+この新しいシステムコールは、ファイルのロックに \fIflock64\fP という別の
+構造体を利用し、これに対応するコマンドとして \fBF_GETLK64\fP,
+\fBF_SETLK64\fP, \fBF_SETLKW64\fP を使用する。
+しかし、 glibc を使うアプリケーションではこれらの詳細を無視することが
+できる。 glibc の \fBfcntl\fP のラッパー関数は新しいシステムコールが
+利用できる場合はそれを利用するようになっているからである。
+.SS "レコードロックと NFS"
+.\"
+.\" Neil Brown: With NFSv3 the failure mode is the reverse.  If
+.\"     the server loses contact with a client then any lock stays in place
+.\"     indefinitely ("why can't I read my mail"... I remember it well).
+.\"
+.\"
+.\" Jeff Layton:
+.\"     Note that this is not a firm timeout. The server runs a job
+.\"     periodically to clean out expired stateful objects, and it's likely
+.\"     that there is some time (maybe even up to another whole lease period)
+.\"     between when the timeout expires and the job actually runs. If the
+.\"     client gets a RENEW in there within that window, its lease will be
+.\"     renewed and its state preserved.
+.\"
+Linux 3.12 より前では、 NFSv4 クライアントが一定時間サーバーと通信がなかった場合 (90 秒間通信がない場合と定義されている)、
+クライアントが気付かずにロックを失い再獲得する場合がある。 (通信がなくなったみなす時間は NFSv4 leastime と呼ばれる。 Linux
+NFS サーバーでは、 この値は \fI/proc/fs/nfsd/nfsv4leasetime\fP を見て決定される。 このファイルの値の単位は秒であり、
+このファイルのデフォルト値は 90 である。) この状況では潜在的にデータ破壊が起こる危険性がある。
+通信がなかった間に他のプロセスがロックを獲得しファイル入出力を行う場合があるからである。
+
+.\" commit ef1820f9be27b6ad158f433ab38002ab8131db4d
+.\" commit f6de7a39c181dfb8a2c534661a53c73afb3081cd
+Linux 3.12 以降、 NFSv4 クライアントがサーバーと通信がなかった場合、
+ロックを持っていると「思っている」プロセスがそのファイルに入出力を行うと失敗する。
+そのプロセスがそのファイルをいったんクローズし再オープンするまでは入出力は失敗する。 カーネルパラメーター
+\fInfs.recover_lost_locks\fP を 1 に設定すると、 Linux 3.12 より前の動作にすることができる。 この場合、
+サーバーとの通信が再確立された場合、 クライアントがは失われたロックを回復しようとする。 データ破壊が起こる危険性があるため、
+このパラメーターはデフォルトでは 0 (無効) になっている。
 .SH バグ
+.SS F_SETFL
+.\" FIXME . According to POSIX.1-2001, O_SYNC should also be modifiable
+.\" via fcntl(2), but currently Linux does not permit this
+.\" See http://bugzilla.kernel.org/show_bug.cgi?id=5994
+\fBF_SETFL\fP を使って、 フラグ \fBO_DSYNC\fP と \fBO_SYNC\fP
+の状態を変更することはできない。これらのフラグの状態を変更しようとした場合には、黙って無視される。
+.SS F_GETOWN
 .\" glibc source: sysdeps/unix/sysv/linux/i386/sysdep.h
 .\" mtk, Dec 04: some limited testing on alpha and ia64 seems to
 .\" indicate that ANY negative PGID value will cause F_GETOWN
 .\" to misinterpret the return as an error. Some other architectures
 .\" seem to have the same range check as i386.
-いくつかのアーキテクチャ (特に i386) における Linux システムコールの慣習
+いくつかのアーキテクチャ (特に i386) における Linux システムコールの慣習
 のため以下の制限が存在する。
 \fBF_GETOWN\fP が返す (負の) プロセスグループID が \-1 から \-4095 の範囲に入った場合、
 glibc はこの返り値をシステムコールでエラーが起こったと間違って解釈してしまう。
@@ -637,26 +913,41 @@ glibc はこの返り値をシステムコールでエラーが起こったと
 が設定されることになる。Linux 固有の \fBF_GETOWN_EX\fP ではこの問題を回避できる。
 glibc バージョン 2.11 以降では、glibc では \fBF_GETOWN_EX\fP を使って
 \fBF_GETOWN\fP を実装することで、カーネルの \fBF_GETOWN\fP の問題を見えないようにしている。
-
-Linux 2.4 以前では、非特権プロセスが \fBF_SETOWN\fP を使って、ソケットのファイルディスクリプタの所有者に 呼び出し元以外のプロセス
+.SS F_SETOWN
+.\"
+Linux 2.4 以前では、非特権プロセスが \fBF_SETOWN\fP を使って、ソケットのファイルディスクリプターの所有者に 呼び出し元以外のプロセス
 (やプロセスグループ) を指定すると 発生するバグがある。この場合、 呼び出し元が所有者として指定したプロセス (やプロセスグループ) に
 シグナルを送る許可を持っていたとしても、 \fBfcntl\fP()  が \-1 を返し \fIerrno\fP に \fBEPERM\fP を設定することがある。
-このエラーが返ったにもかかわらず、ファイルディスクリプタの所有者 は設定され、シグナルはその所有者に送られる。
-
+このエラーが返ったにもかかわらず、ファイルディスクリプターの所有者 は設定され、シグナルはその所有者に送られる。
+.SS デッドロックの検出
+.\"
+\fBF_SETLKW\fP 要求を処理する際にカーネルが使用するデッドロック検出アルゴリズムは、 false negative になる場合
+(デッドロックを検出できず、 デッドロックになったプロセスは無限に停止する) も false positive になる場合 (デッドロックがない場合でも
+\fBEDEADLK\fP エラーとなる) もある。 例えば、 カーネルは依存関係の検索を行うロックの深さを 10 ステップに限定しているが、
+このためこれよりも長い循環するデッドロックは検出されない。 また、 \fBclone\fP(2) の \fBCLONE_FILES\fP フラグを使って作成された
+2 つ以上のプロセスが (カーネルにとって) 衝突するように見えるロックを適用した場合、 カーネルはデッドロックを誤って検出する。
+.SS "強制ロック (mandatory locking)"
 .\" http://marc.info/?l=linux-kernel&m=119013491707153&w=2
-これまでの Linux の全てのバージョンにおける強制ロックの実装は、 競合条件下で強制ロックが不完全になるような場合がある。
-ロックと重なって実行された \fBwrite\fP(2)  の呼び出しは強制ロックが獲得された後にもデータを変更することができる。 ロックと重なって実行された
-\fBread\fP(2)  の呼び出しは強制ロックが獲得された後になって行われたデータの変更を 検出することができる。 同様の競合条件が強制ロックと
-\fBmmap\fP(2)  の間にも存在する。それゆえ、強制ロックに頼るのはお薦めできない。
+.\"
+.\" Reconfirmed by Jeff Layton
+.\"     From: Jeff Layton <jlayton <at> redhat.com>
+.\"     Subject: Re: Status of fcntl() mandatory locking
+.\"     Newsgroups: gmane.linux.file-systems
+.\"     Date: 2014-04-28 10:07:57 GMT
+.\"     http://thread.gmane.org/gmane.linux.file-systems/84481/focus=84518
+Linux の強制ロックの実装は、 競合条件下で強制ロックが不完全になるような場合がある。 ロックと重なって実行された \fBwrite\fP(2)
+の呼び出しは強制ロックが獲得された後にもデータを変更することができる。 ロックと重なって実行された \fBread\fP(2)
+の呼び出しは強制ロックが獲得された後になって行われたデータの変更を 検出することができる。 同様の競合条件が強制ロックと \fBmmap\fP(2)
+の間にも存在する。それゆえ、強制ロックに頼るのはお薦めできない。
 .SH 関連項目
 \fBdup2\fP(2), \fBflock\fP(2), \fBopen\fP(2), \fBsocket\fP(2), \fBlockf\fP(3),
 \fBcapabilities\fP(7), \fBfeature_test_macros\fP(7)
 
-\fIlocks.txt\fP, \fImandatory\-locking.txt\fP, and \fIdnotify.txt\fP in the Linux
-kernel source directory \fIDocumentation/filesystems/\fP (on older kernels,
-these files are directly under the \fIDocumentation/\fP directory, and
-\fImandatory\-locking.txt\fP is called \fImandatory.txt\fP)
+Linux カーネルソースの \fIDocumentation/filesystems/\fP ディレクトリ内の \fIlocks.txt\fP,
+\fImandatory\-locking.txt\fP, \fIdnotify.txt\fP (以前のカーネルでは、これらのファイルは
+\fIDocumentation/\fP ディレクトリ直下にあり、 \fImandatory\-locking.txt\fP は \fImandatory.txt\fP
+という名前であった)
 .SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.50 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.78 の一部
 である。プロジェクトの説明とバグ報告に関する情報は
 http://www.kernel.org/doc/man\-pages/ に書かれている。