.\" 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 2014\-04\-20 Linux "Linux Programmer's Manual"
.SH 名前
fcntl \- ファイルディスクリプタの操作を行う
.SH 書式
\fBF_DUPFD\fP と同様だが、それに加えて複製されたディスクリプタに対して close\-on\-exec フラグをセットする。
このフラグを指定することで、プログラムは \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»ã\83\95ã\83©ã\82°
+.SS ファイルディスクリプタフラグ
以下のコマンドを使って、ファイルディスクリプタに関連するフラグ を操作することができる。 現在のところ、定義されているフラグは一つだけである:
\fBFD_CLOEXEC\fP (close\-on\-exec フラグ)。 \fBFD_CLOEXEC\fP ビットが 0 なら、ファイルディスクリプタは
\fBexecve\fP(2) を行ってもオープンされたままだが、そうでない場合はクローズされる。
.TP
\fBF_GETFD\fP (\fIvoid\fP)
-ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83»ã\83\95ã\83©ã\82°ã\82\92èªã\81¿å\87ºã\81\99ã\80\82 \fIarg\fP ã\81¯ç\84¡è¦\96ã\81\95ã\82\8cã\82\8bã\80\82
+ファイルディスクリプタフラグを読み出す。 \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),
\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 アドバイザリロック
+\fBF_SETLK\fP, \fBF_SETLKW\fP, \fBF_GETLK\fP は、レコードロックの獲得/解放/テストのために使用する
+(レコードロックはファイルセグメントロックや ファイル領域ロックとも呼ばれる)。 三番目の引き数 \fIlock\fP
は、以下に示すフィールドを含む構造体へのポインタである (フィールドの順序は関係なく、構造体に他のフィールドがあってもよい)。
.in +4n
.nf
に負の値を指定することができる。
\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
を設定し、他のフィールドは変更せずに、復帰する。 違う種別のロックが (一つもしくは複数) 適用されていて ロックを適用できないような場合には、
\fBfcntl\fP() は、原因となったロックの一つについての詳細情報を構造体 \fIlock\fP のフィールド \fIl_type\fP,
\fIl_whence\fP, \fIl_start\fP, \fIl_len\fP に格納し、また \fIl_pid\fP にロックを保持しているプロセスの PID
-を設定して、復帰する。
+を設定して、復帰する。 \fBF_GETLK\fP が返す情報は呼び出し元がその情報を使用するときにはすでに古くなっている可能性がある点に注意すること。
.P
読み出しロックを適用するには、 \fIfd\fP は読み出し用にオープンされていなければならない。 書き込みロックを適用するには、 \fIfd\fP
は書き込み用にオープンされていなければならない。 読み書き両方のロックを適用するには、読み書き両用で ファイルをオープンしなければならない。
\fBstdio\fP(3) ではバッファリングが行われるので、 stdio 関連の関数ではレコードのロックの使用は回避される; 代わりに
\fBread\fP(2) や \fBwrite\fP(2) を使用すること。
.SS "強制ロック (mandatory locking)"
-ä¸\8aè¿°ã\81®ã\83ã\83\83ã\82¯ã\81«ã\81¯ã\82¢ã\83\89ã\83\90ã\82¤ã\82¶ã\83ªã\83»ã\83ã\83\83ã\82¯ (advisory lock) ã\81¨å¼·å\88¶ã\83ã\83\83ã\82¯ (mandatory lock)
-ã\81®äº\8c種é¡\9eã\81\8cã\81\82ã\82\8bã\81\8cã\80\81ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81§ã\81¯ã\82¢ã\83\89ã\83\90ã\82¤ã\82¶ã\83ªã\83»ã\83ã\83\83ã\82¯ã\81¨ã\81ªã\82\8bã\80\82
+上述のロックにはアドバイザリロック (advisory lock) と強制ロック (mandatory lock)
+の二種類があるが、デフォルトではアドバイザリロックとなる。
-ã\82¢ã\83\89ã\83\90ã\82¤ã\82¶ã\83ªã\83»ã\83ã\83\83ã\82¯ã\81«å¼·å\88¶å\8a\9bã\81¯ã\81ªã\81\8fã\80\81å\8d\94調ã\81\97ã\81¦å\8b\95ä½\9cã\81\99ã\82\8bã\83\97ã\83ã\82»ã\82¹é\96\93ã\81§ã\81®ã\81¿ æ\9c\89å\8a¹ã\81§ã\81\82ã\82\8bã\80\82
+アドバイザリロックに強制力はなく、協調して動作するプロセス間でのみ 有効である。
強制ロックは全てのプロセスに対して効果がある。 あるプロセスが互換性のない強制ロックが適用されたファイル領域に対して (\fBread\fP(2) や
\fBwrite\fP(2) により) 互換性のないアクセスを実行しようとした場合、 アクセスの結果は そのファイルのオープンファイル記述で
.\" 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
に渡された値にしたがって決められる。
これらの機構を使用することで、ほとんどの場合で \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
リースに格下げすれば 十分である。これをするには、 \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 の満了後にカーネルが強制的に
新しいディスクリプタを返す。
.TP
\fBF_GETFD\fP
-ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83»ã\83\95ã\83©ã\82°ã\81®å\80¤
+ファイルディスクリプタフラグの値
.TP
\fBF_GETFL\fP
ファイル状態フラグの値
他のプロセスが保持しているロックによって操作が禁止されている。
.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»ã\83\9eã\83\83ã\83\97ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81 æ\93\8dä½\9cã\81\8cç¦\81æ¢ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\80\82
+そのファイルは他のプロセスによってメモリマップされているため、 操作が禁止されている。
.TP
\fBEBADF\fP
\fIfd\fP がオープンされたファイルディスクリプタでない。 あるいはコマンドが \fBF_SETLK\fP または \fBF_SETLKW\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
\fBEPERM\fP
\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 で規定されている。
(これら定義するには、
はっきりと言えることは、ロックを保持しているプロセスが別のマシンに存在 する場合には、 \fIl_pid\fP
だけはあまり役にたたないだろうということである。
.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
が設定されることになる。Linux 固有の \fBF_GETOWN_EX\fP ではこの問題を回避できる。
glibc バージョン 2.11 以降では、glibc では \fBF_GETOWN_EX\fP を使って
\fBF_GETOWN\fP を実装することで、カーネルの \fBF_GETOWN\fP の問題を見えないようにしている。
-
+.SS F_SETOWN
Linux 2.4 以前では、非特権プロセスが \fBF_SETOWN\fP を使って、ソケットのファイルディスクリプタの所有者に 呼び出し元以外のプロセス
(やプロセスグループ) を指定すると 発生するバグがある。この場合、 呼び出し元が所有者として指定したプロセス (やプロセスグループ) に
シグナルを送る許可を持っていたとしても、 \fBfcntl\fP() が \-1 を返し \fIerrno\fP に \fBEPERM\fP を設定することがある。
このエラーが返ったにもかかわらず、ファイルディスクリプタの所有者 は設定され、シグナルはその所有者に送られる。
-
+.SS "強制ロック (mandatory locking)"
.\" http://marc.info/?l=linux-kernel&m=119013491707153&w=2
これまでの Linux の全てのバージョンにおける強制ロックの実装は、 競合条件下で強制ロックが不完全になるような場合がある。
ロックと重なって実行された \fBwrite\fP(2) の呼び出しは強制ロックが獲得された後にもデータを変更することができる。 ロックと重なって実行された
\fIDocumentation/\fP ディレクトリ直下にあり、 \fImandatory\-locking.txt\fP は \fImandatory.txt\fP
という名前であった)
.SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.51 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.65 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。