--- /dev/null
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" Copyright (c) 2003 Nick Clifford (zaf@nrc.co.nz), Jan 25, 2003
+.\" Copyright (c) 2003 Andries Brouwer (aeb@cwi.nl), Aug 24, 2003
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\" 2003-08-23 Martin Schulze <joey@infodrom.org> improvements
+.\" 2003-08-24 aeb, large parts rewritten
+.\" 2004-08-06 Christoph Lameter <clameter@sgi.com>, SMP note
+.\"
+.\" FIXME: Linux 2.6.39 adds CLOCK_BOOTTIME
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH CLOCK_GETRES 2 2012\-04\-25 "" "Linux Programmer's Manual"
+.SH 名前
+clock_getres, clock_gettime, clock_settime \- クロックと時間の関数
+.SH 書式
+\fB#include <time.h>\fP
+.sp
+\fBint clock_getres(clockid_t \fP\fIclk_id\fP\fB, struct timespec *\fP\fIres\fP\fB);\fP
+
+\fBint clock_gettime(clockid_t \fP\fIclk_id\fP\fB, struct timespec *\fP\fItp\fP\fB);\fP
+
+\fBint clock_settime(clockid_t \fP\fIclk_id\fP\fB, const struct timespec
+*\fP\fItp\fP\fB);\fP
+.sp
+\fI\-lrt\fP でリンクする。
+.sp
+.in -4n
+glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照):
+.in
+.sp
+.ad l
+\fBclock_getres\fP(), \fBclock_gettime\fP(), \fBclock_settime\fP():
+.RS
+_POSIX_C_SOURCE\ >=\ 199309L
+.RE
+.ad b
+.SH 説明
+関数 \fBclock_getres\fP() は 指定されたクロック \fIclk_id\fP の分解能 (精度) を探し出す。 \fIres\fP が NULL
+でない場合、その分解能を \fIres\fP で指される \fIstruct timespec\fP に格納する。 クロックの分解能は実装に依存し、
+特定のプロセスによって設定することはできない。 \fBclock_settime\fP() の引き数 \fItp\fP で指される時間の値が \fIres\fP
+の倍数でない場合、 \fIres\fP の倍数に切り詰められる。
+.PP
+関数 \fBclock_gettime\fP() と \fBclock_settime\fP() は、指定されたクロック \fIclk_id\fP
+の時間を取得または設定する。
+.PP
+\fIres\fP と \fItp\fP 引き数は \fItimespec\fP 構造体であり、 \fI<time.h>\fP で以下のように規定されている:
+.sp
+.in +4n
+.nf
+struct timespec {
+ time_t tv_sec; /* seconds */
+ long tv_nsec; /* nanoseconds */
+};
+.fi
+.in
+.PP
+\fIclk_id\fP 引き数は特定のクロックの識別子であり、そのクロックで動作する。 クロックはシステム全体に適用することもでき、
+その場合は全てのプロセスから見ることができる。 また 1 つのプロセス内でのみ時間を計測する場合は、 プロセス毎に適用することもできる。
+.LP
+全ての実装においてシステム全体のリアルタイムクロックがサポートされ、 \fBCLOCK_REALTIME\fP で識別される。 時間は紀元 (the
+Epoch) からの秒とナノ秒で表される。 時間が変更された場合、相対的な時間間隔のタイマは影響を受けないが、 絶対的な時点のタイマは影響を受ける。
+.LP
+さらにいくつかのクロックが実装されているかもしれない。 対応する時間の値を解釈する方法とタイマへの影響は、定められていない。
+.LP
+glibc と Linux カーネルの最新のバージョンでは、 以下のような十分なクロックがサポートされている。
+.TP
+\fBCLOCK_REALTIME\fP
+システム全体のリアルタイムクロック。 このクロックを設定するには適切な特権が必要である。
+.TP
+\fBCLOCK_MONOTONIC\fP
+設定することができないクロックで、ある開始時点からの単調増加の時間で
+表現されるクロック (開始時点がどの時点となるかは規定されていない)。
+この時計は、システム時間の不連続な変化 (例えば、システム管理者がシステ
+ム時間を手動で変更した場合など) の影響を受けないが、
+\fBadjtime\fP や NTP が行う段階的な調整の影響を受ける。
+.TP
+\fBCLOCK_MONOTONIC_RAW\fP (Linux 2.6.28 以降; Linux 特有)
+.\" Added in commit 2d42244ae71d6c7b0884b5664cf2eda30fb2ae68, John Stultz
+\fBCLOCK_MONOTONIC\fP と同様だが、NTP による調整や \fBadjtime\fP(2) が行う
+段階的な調整の影響を受けない、ハードウェアによる生の時刻へのアクセス
+ができる。
+.TP
+\fBCLOCK_PROCESS_CPUTIME_ID\fP
+CPU による高分解能のプロセス毎のタイマ。
+.TP
+\fBCLOCK_THREAD_CPUTIME_ID\fP
+スレッド固有の CPU タイムクロック。
+.SH 返り値
+\fBclock_gettime\fP(), \fBclock_settime\fP(), \fBclock_getres\fP() は成功した場合に 0
+を返し、失敗した場合に \-1 を返す (失敗した場合、 \fIerrno\fP が適切に設定される)。
+.SH エラー
+.TP
+\fBEFAULT\fP
+\fItp\fP がアクセス可能なアドレス空間の外を指した。
+.TP
+\fBEINVAL\fP
+.\" Linux also gives this error on attempts to set CLOCK_PROCESS_CPUTIME_ID
+.\" and CLOCK_THREAD_CPUTIME_ID, when probably the proper error should be
+.\" EPERM.
+指定された \fIclk_id\fP がこのシステムでサポートされていない。
+.TP
+\fBEPERM\fP
+指示されたクロックを設定する権限が \fBclock_settime\fP() にない。
+.SH 準拠
+SUSv2, POSIX.1\-2001.
+.SH 可用性
+これらの関数が利用可能な POSIX システムでは、\fI<unistd.h>\fP においてシンボル \fB_POSIX_TIMERS\fP が
+0 より大きい値に定義されている。 シンボル \fB_POSIX_MONOTONIC_CLOCK\fP, \fB_POSIX_CPUTIME\fP,
+\fB_POSIX_THREAD_CPUTIME\fP は \fBCLOCK_MONOTONIC\fP, \fBCLOCK_PROCESS_CPUTIME_ID\fP,
+\fBCLOCK_THREAD_CPUTIME_ID\fP が利用可能なことを示す。 (\fBsysconf\fP(3) も参照すること。)
+.SH 注意
+.SS "SMP システムについての注意"
+\fBCLOCK_PROCESS_CPUTIME_ID\fP と \fBCLOCK_THREAD_CPUTIME_ID\fP クロックは、CPU からのタイマ
+(i386 上の TSC、Itanium 上の AR.ITC) を用いて実現されている。 これらのレジスタは CPU 間で異なる可能性があり、
+プロセスが他の CPU に移動させられた場合、 結果としてこれらのクロックが\fB偽の結果\fP (bogus results) を返すかもしれない。
+.PP
+SMP システムの各 CPU が別々のクロック源を持つ場合、 タイマレジスタ間の相互関係を管理する方法はない。 これは各 CPU
+が微妙に異なる周波数で動作するためである。 これが真実の場合 (訳註: 各 CPU が別々のクロック源を持つ場合)、
+\fIclock_getcpuclockid(0)\fP は \fBENOENT\fP を返して、その状況を表す。 2 つのクロックは、プロセスが特定の CPU
+上に留まっていることが 保証できる場合にのみ有効である。
+.PP
+SMP システムの各プロセッサは全く同じ時刻に起動する訳ではないので、 各タイマレジスタは通常はあるオフセットで動作している。
+オフセットをブート時に制限するコードが含まれるアーキテクチャもある。 しかし、このコードがオフセットを正確に調整することは保証できない。 glibc は
+(Linux カーネルとは異なり) オフセットを扱うためのコードを提供しない。 通常はこれらのオフセットが小さいので、多くの場合でその影響は無視できる。
+.SH バグ
+.\" See http://bugzilla.kernel.org/show_bug.cgi?id=11972
+POSIX.1\-2001 では、 「適切な特権 (appropriate privileges)」を持ったプロセスは、
+\fBclock_settime\fP() を使って、クロック \fBCLOCK_PROCESS_CPUTIME_ID\fP と
+\fBCLOCK_THREAD_CPUTIME_ID\fP を設定することができるとされている。 Linux では、これらのクロックは設定可能ではない
+(すなわち、どのプロセスも「適切な特権」を持たない)。
+.SH 関連項目
+\fBdate\fP(1),
+\fBadjtime\fP(2),
+\fBgettimeofday\fP(2),
+\fBsettimeofday\fP(2),
+\fBtime\fP(2),
+\fBclock_getcpuclockid\fP(3),
+\fBctime\fP(3),
+\fBftime\fP(3),
+\fBpthread_getcpuclockid\fP(3),
+\fBsysconf\fP(3),
+ time (7)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" Copyright (c) 1992 Drew Eckhardt <drew@cs.colorado.edu>, March 28, 1992
+.\" and Copyright (c) Michael Kerrisk, 2001, 2002, 2005
+.\" May be distributed under the GNU General Public License.
+.\" Modified by Michael Haardt <michael@moria.de>
+.\" Modified 24 Jul 1993 by Rik Faith <faith@cs.unc.edu>
+.\" Modified 21 Aug 1994 by Michael Chastain <mec@shell.portal.com>:
+.\" New man page (copied from 'fork.2').
+.\" Modified 10 June 1995 by Andries Brouwer <aeb@cwi.nl>
+.\" Modified 25 April 1998 by Xavier Leroy <Xavier.Leroy@inria.fr>
+.\" Modified 26 Jun 2001 by Michael Kerrisk
+.\" Mostly upgraded to 2.4.x
+.\" Added prototype for sys_clone() plus description
+.\" Added CLONE_THREAD with a brief description of thread groups
+.\" Added CLONE_PARENT and revised entire page remove ambiguity
+.\" between "calling process" and "parent process"
+.\" Added CLONE_PTRACE and CLONE_VFORK
+.\" Added EPERM and EINVAL error codes
+.\" Renamed "__clone" to "clone" (which is the prototype in <sched.h>)
+.\" various other minor tidy ups and clarifications.
+.\" Modified 26 Jun 2001 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Updated notes for 2.4.7+ behavior of CLONE_THREAD
+.\" Modified 15 Oct 2002 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Added description for CLONE_NEWNS, which was added in 2.4.19
+.\" Slightly rephrased, aeb.
+.\" Modified 1 Feb 2003 - added CLONE_SIGHAND restriction, aeb.
+.\" Modified 1 Jan 2004 - various updates, aeb
+.\" Modified 2004-09-10 - added CLONE_PARENT_SETTID etc. - aeb.
+.\" 2005-04-12, mtk, noted the PID caching behavior of NPTL's getpid()
+.\" wrapper under BUGS.
+.\" 2005-05-10, mtk, added CLONE_SYSVSEM, CLONE_UNTRACED, CLONE_STOPPED.
+.\" 2005-05-17, mtk, Substantially enhanced discussion of CLONE_THREAD.
+.\" 2008-11-18, mtk, order CLONE_* flags alphabetically
+.\" 2008-11-18, mtk, document CLONE_NEWPID
+.\" 2008-11-19, mtk, document CLONE_NEWUTS
+.\" 2008-11-19, mtk, document CLONE_NEWIPC
+.\" 2008-11-19, Jens Axboe, mtk, document CLONE_IO
+.\"
+.\" FIXME Document CLONE_NEWUSER, which is new in 2.6.23
+.\" (also supported for unshare()?)
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH CLONE 2 2011\-09\-08 Linux "Linux Programmer's Manual"
+.SH 名前
+clone, __clone2 \- 子プロセスを作成する
+.SH 書式
+.nf
+.\" Actually _BSD_SOURCE || _SVID_SOURCE
+.\" FIXME See http://sources.redhat.com/bugzilla/show_bug.cgi?id=4749
+\fB#define _GNU_SOURCE\fP /* feature_test_macros(7) 参照 */
+\fB#include <sched.h>\fP
+
+\fBint clone(int (*\fP\fIfn\fP\fB)(void *), void *\fP\fIchild_stack\fP\fB,\fP
+\fB int \fP\fIflags\fP\fB, void *\fP\fIarg\fP\fB, ... \fP
+\fB /* pid_t *\fP\fIptid\fP\fB, struct user_desc *\fP\fItls\fP\fB, pid_t *\fP\fIctid\fP\fB */ );\fP
+.fi
+.SH 説明
+\fBclone\fP() は \fBfork\fP(2) と同じような方法で新しいプロセスを作成する。 \fBclone\fP()
+には、ライブラリ関数とその下層にあたる \fBclone\fP() システムコールが存在する。以下の説明では、システムコールの方を \fBsys_clone\fP
+と表すこととする。 \fBsys_clone\fP に関する説明はこのマニュアルの最後の方にある。
+
+\fBfork\fP(2) とは異なり、これらのコールでは、子プロセス (child process) と呼び出し元のプロセスとが、メモリ空間、
+ファイルディスクリプタのテーブル、シグナル・ハンドラのテーブルなどの 実行コンテキストの一部を共有できる。
+(このマニュアルにおける「呼び出し元のプロセス」は、通常は 「親プロセス」と一致する。但し、後述の \fBCLONE_PARENT\fP の項も参照のこと)
+
+\fBclone\fP() の主要な使用法はスレッド (threads) を実装することである:
+一つのプログラムの中の複数のスレッドは共有されたメモリ空間で 同時に実行される。
+
+\fBclone\fP() で子プロセスが作成された時に、作成された子プロセスは関数 \fIfn\fP(\fIarg\fP) を実行する。 (この点が
+\fBfork\fP(2) とは異なる。 \fBfork\fP(2) の場合、子プロセスは \fBfork\fP(2) が呼び出された場所から実行を続ける。)
+\fIfn\fP 引き数は、子プロセスが実行を始める時に子プロセスが呼び出す 関数へのポインタである。 \fIarg\fP 引き数はそのまま \fIfn\fP
+関数へと渡される。
+
+\fIfn\fP(\fIarg\fP) 関数が終了すると、子プロセスは終了する。 \fIfn\fP によって返された整数が子プロセスの終了コードとなる。 子プロセスは、
+\fBexit\fP(2) を呼んで明示的に終了することもあるし、致命的なシグナルを受信した 場合に終了することもある。
+
+\fIchild_stack\fP 引き数は、子プロセスによって使用されるスタックの位置を指定する。
+子プロセスと呼び出し元のプロセスはメモリを共有することがあるため、 子プロセスは呼び出し元のプロセスと同じスタックで実行することができない。
+このため、呼び出し元のプロセスは子プロセスのスタックのためのメモリ空間を 用意して、この空間へのポインタを \fBclone\fP()
+へ渡さなければならない。 (HP PA プロセッサ以外の) Linux が動作する全てのプロセッサでは、 スタックは下方 (アドレスが小さい方向)
+へと伸びる。このため、普通は \fIchild_stack\fP は子プロセスのスタックのために用意したメモリ空間の一番大きい アドレスを指すようにする。
+
+\fIflags\fP の下位 1 バイトは子プロセスが死んだ場合に親プロセスへと送られる \fI終了シグナル (termination signal)\fP
+の番号を指定する。このシグナルとして \fBSIGCHLD\fP 以外が指定された場合、親プロセスは、 \fBwait\fP(2)
+で子プロセスを待つ際に、オプションとして \fB__WALL\fP または \fB__WCLONE\fP を指定しなければならない。
+どのシグナルも指定されなかった場合、子プロセスが終了した時に親プロセス にシグナルは送られない。
+
+\fIflags\fP には、以下の定数のうち 0個以上をビット毎の論理和 (bitwise\-or)
+をとったものを指定できる。これらの定数は呼び出し元のプロセスと 子プロセスの間で何を共有するかを指定する:
+.TP
+\fBCLONE_CHILD_CLEARTID\fP (Linux 2.5.49 以降)
+子プロセスが終了したときに子プロセスのメモリ内の \fIctid\fP が指す場所にある子プロセスのスレッド ID を消去し、 そのアドレスで futex を
+wake (起床) させる。 このアドレスは \fBset_tid_address\fP(2) システムコールで変更することができる。
+この機能はスレッドライブラリで使用される。
+.TP
+\fBCLONE_CHILD_SETTID\fP (Linux 2.5.49 以降)
+子プロセスのメモリ内の \fIctid\fP が指す場所に子プロセスのスレッド ID を格納する。
+.TP
+\fBCLONE_FILES\fP
+\fBCLONE_FILES\fP が設定された場合、呼び出し元のプロセスと子プロセスはファイルディスクリプタの テーブルを共有する。
+呼び出し元プロセスとその子プロセスの一方が作成した ファイルディスクリプタは、もう一方においても有効である。
+同じように、一方のプロセスがファイルディスクリプタを閉じたり、 (\fBfcntl\fP(2) \fBF_SETFD\fP 操作を使って)
+ディスクリプタに関連するフラグを変更したりすると、 もう一方のプロセスにも影響する。
+
+\fBCLONE_FILES\fP が設定されていない場合、子プロセスは、 \fBclone\fP()
+が実行された時点で、呼び出し元のプロセスがオープンしている全ての ファイルディスクリプタのコピーを継承する
+(子プロセスの複製されたファイルディスクリプタは、 対応する呼び出し元のプロセスのファイルディスクリプタと 同じファイル記述 (\fBopen\fP(2)
+参照) を参照する)。 これ以降に、呼び出し元のプロセスと子プロセスの一方が ファイルディスクリプタの操作 (ファイルディスクリプタの
+オープン・クローズや、ファイルディスクリプタ・フラグの変更) を行っても、もう一方のプロセスには影響を与えない。
+.TP
+\fBCLONE_FS\fP
+\fBCLONE_FS\fP が設定された場合、呼び出し元のプロセスと子プロセスが同じファイル・システム
+情報を共有する。ファイル・システム情報は、ファイル・システムのルート (root)、 カレント・ワーキング・ディレクトリ (current
+working directory) や umask などである。 呼び出し元のプロセスや子プロセスのどちらか一方によって \fBchroot\fP(2),
+\fBchdir\fP(2), \fBumask\fP(2) が呼び出されると、もう一方のプロセスにも影響が及ぶ。
+
+\fBCLONE_FS\fP が設定されていない場合、子プロセスは、 \fBclone\fP()
+が実行された時点での、呼び出し元のプロセスのファイル・システム情報のコピーを 使用する。 これ以降は、呼び出し元のプロセスと子プロセスの一方が
+\fBchroot\fP(2), \fBchdir\fP(2), \fBumask\fP(2) を呼び出しても、もう一方のプロセスには影響を与えない。
+.TP
+\fBCLONE_IO\fP (Linux 2.6.25 以降)
+\fBCLONE_IO\fP が設定された場合、新しいプロセスは呼び出し元のプロセスと I/O コンテキストを共有する。
+このフラグが設定されていない場合には、 (\fBfork\fP(2) の場合と同様) 新しいプロセスは自分専用の I/O コンテキストを持つ。
+
+.\" The following based on text from Jens Axboe
+.\" the anticipatory and CFQ scheduler
+.\" with CFQ and AS.
+I/O コンテキストは、ディスクスケジュールの I/O スコープである (言い換えると、I/O コンテキストは I/O スケジューラがプロセス I/O
+の スケジューリングをモデル化するのに使用される)。 複数のプロセスが同じ I/O コンテキストを共有する場合、 これらのプロセスは I/O
+スケジューラからは一つとして扱われる。 結果として、これらのプロセスはディスクアクセスの時間を共有するようになる。 いくつかの I/O
+スケジューラでは、 二つのプロセスが I/O コンテキストを共有している場合、 これらのプロセスはディスクアクセスを交互に行うことができる。
+同じプロセスの複数のスレッドが I/O を実行している場合 (例えば \fBaio_read\fP(3))、 \fBCLONE_IO\fP を利用することで I/O
+性能を良くすることができる。
+
+カーネルの設定が \fBCONFIG_BLOCK\fP オプション付きでない場合、 このフラグは何の意味も持たない。
+.TP
+\fBCLONE_NEWIPC\fP (Linux 2.6.19 以降)
+\fBCLONE_NEWIPC\fP が設定された場合、新しい IPC 名前空間 (namespace) でプロセスを作成する。
+このフラグが設定されていない場合、 (\fBfork\fP(2) の場合と同様) 呼び出し元のプロセスと同じ IPC 名前空間でプロセスが 作成される。
+このフラグは、コンテナの実装での使用を意図して用意されたものである。
+
+IPC 名前空間は、System V IPC オブジェクト用の識別子 (identifiers) の 集合で構成される (System V IPC
+オブジェクトは \fBmsgctl\fP(2), \fBsemctl\fP(2), \fBshmctl\fP(2) を使って作成される)。 ある IPC
+名前空間に作成されたオブジェクトは、 その名前空間のメンバーである他のすべてのプロセスからも見えるが、 違う IPC 名前空間のプロセスからは見えない。
+
+IPC 名前空間が破棄される時 (すなわち、その名前空間のメンバーの最後のプロセスが終了する時)、 その名前空間の全ての IPC
+オブジェクトは自動的に破棄される。
+
+このフラグを使用するためには、 カーネルでオプション \fBCONFIG_SYSVIPC\fP と \fBCONFIG_IPC_NS\fP を有効になっていること、
+プロセスが特権 (\fBCAP_SYS_ADMIN\fP) を持っていることが必要である。 このフラグは \fBCLONE_SYSVSEM\fP
+と組み合わせて使うことはできない。
+.TP
+\fBCLONE_NEWNET\fP (Linux 2.6.24 以降)
+.\" FIXME Check when the implementation was completed
+(このフラグの実装は、Linux 2.6.29 あたりまでに完成した。)
+
+\fBCLONE_NEWNET\fP が設定された場合、新しいネットワーク名前空間 (network namaspace) でプロセスを作成する。
+このフラグが設定されていない場合、 (\fBfork\fP(2) の場合と同様) 呼び出し元のプロセスと同じネットワーク名前空間でプロセスが 作成される。
+このフラグは、コンテナの実装での使用を意図して用意されたものである。
+
+ネットワーク名前空間は、分離されたネットワークスタックを提供するものである (ネットワークスタックとは、 ネットワークデバイスインタフェース、IPv4
+や IPv6 プロトコルスタック、 \fI/proc/net\fP、 \fI/sys/class/net\fP ディレクトリツリー、ソケットなどである)。
+物理ネットワークデバイスが所属できるネットワーク名前空間は一つだけである。 仮想ネットワークデバイス ("veth") のペアにより パイプ風の抽象化
+(abstraction) が実現されており、 これを使うことで、ネットワーク名前空間間のトンネルを作成したり、
+別の名前空間の物理ネットワークデバイスへのブリッジを作成したり することができる。
+
+ネットワーク名前空間が解放される時 (すなわち、その名前空間の最後のプロセスが終了する時)、 物理ネットワークデバイスは初期ネットワーク名前空間
+(initial network namespace) に戻される (親プロセスのネットワーク名前空間に戻される訳ではない)。
+
+このフラグを使用するためには、 カーネルでオプション \fBCONFIG_NET_NS\fP を有効になっていること、 プロセスが特権
+(\fBCAP_SYS_ADMIN\fP) を持っていることが必要である。
+.TP
+\fBCLONE_NEWNS\fP (Linux 2.4.19 以降)
+子プロセスを新しいマウント名前空間 (mount namespace) で開始する。
+
+各プロセスはある一つのマウント名前空間中に存在する。プロセスの \fI名前空間 (namespace)\fP
+は、そのプロセスから見えるファイル階層を表すデータ (mount の集合) である。 \fBCLONE_NEWNS\fP フラグがセットされずに
+\fBfork\fP(2) か \fBclone\fP() が呼ばれると、子プロセスは親プロセスと同じマウント名前空間に作成される。 システムコール
+\fBmount\fP(2)、 \fBumount\fP(2) が呼ばれると呼び出し元のプロセスのマウント名前空間が変更され、この結果
+呼び出し元のプロセスと同じ名前空間にいるプロセスはすべて影響を受けるが、 異なるマウント名前空間にいるプロセスは影響を受けない。
+
+\fBCLONE_NEWNS\fP フラグがセットされて \fBclone\fP() が呼ばれると、clone で作成された子プロセスは新しいマウント名前空間で
+開始される。新しい名前空間は親プロセスの名前空間のコピーで初期化される。
+
+特権プロセス (\fBCAP_SYS_ADMIN\fP ケーパビリティを持つプロセス) のみが \fBCLONE_NEWNS\fP フラグを指定することができる。
+一つの \fBclone\fP() 呼び出しで、 \fBCLONE_NEWNS\fP と \fBCLONE_FS\fP の両方を指定することはできない。
+.TP
+\fBCLONE_NEWPID\fP (Linux 2.6.24 以降)
+.\" This explanation draws a lot of details from
+.\" http://lwn.net/Articles/259217/
+.\" Authors: Pavel Emelyanov <xemul@openvz.org>
+.\" and Kir Kolyshkin <kir@openvz.org>
+.\"
+.\" The primary kernel commit is 30e49c263e36341b60b735cbef5ca37912549264
+.\" Author: Pavel Emelyanov <xemul@openvz.org>
+\fBCLONE_NEWPID\fP が設定された場合、新しい PID 名前空間でプロセスを作成する。 このフラグが設定されていない場合、
+(\fBfork\fP(2) の場合と同様) 呼び出し元のプロセスと同じ PID 名前空間で プロセスが作成される。
+このフラグは、コンテナの実装での使用を意図して用意されたものである。
+
+PID 名前空間は、PID に関して分離された環境を提供するものである。 新しい名前空間における PID は 1 から始まり
+(これはスタンドアロンのシステムと似たような感じ)、 \fBfork\fP(2), \fBvfork\fP(2), \fBclone\fP()
+を呼び出すと、その名前空間で一意な PID を持ったプロセスが作成される。
+
+新しい名前空間で作成される最初のプロセス (つまり、 \fBCLONE_NEWPID\fP フラグを使って作成されたプロセス) の PID は 1 であり、
+このプロセスはその名前空間における "init" プロセスとなる。 この名前空間において孤児 (orphaned) となった子プロセスについては、
+\fBinit\fP(8) ではなくこのプロセスが親プロセスとなる。 昔ながらの \fBinit\fP プロセスとは違い、PID 名前空間の "init"
+プロセスは終了 (terminated) する ことができ、その場合には、この名前空間の全てのプロセスが終了される。
+
+PID 名前空間間には階層構造が形成される。 新しい PID 名前空間が作成されると、その名前空間のプロセスは、 新しい名前空間を作成したプロセスの
+PID 名前空間で見える。 同様に、親の PID 名前空間自体が別の PID 名前空間の子供の場合には、 子供の PID 名前空間と親の PID
+名前空間のプロセスはどれも 親の親の PID 名前空間でも見えることになる。 反対に、「子供」の PID 名前空間のプロセスには、
+親の名前空間のプロセスは見えない。 名前空間に階層構造が存在するということは、個々のプロセスは 複数の PID を持つということを意味している。
+そのプロセスが見える名前空間一つにつき PID が一つあり、 それぞれの PID は対応する名前空間において一意である。 (\fBgetpid\fP(2)
+を呼び出すと、常にそのプロセスが存在している名前空間における PID が返される。)
+
+.\" mount -t proc proc /proc
+新しい名前空間の作成後には、 子プロセスにおいて、 \fBps\fP(1) といったツールが正しく動作するように、 自身の root ディレクトリを変更し、
+\fI/proc\fP に新しい procfs インスタンスをマウントするのがよいだろう。 (\fBflags\fP に \fBCLONE_NEWNS\fP
+も指定されていた場合には、root ディレクトリを変更する必要はなく、 いきなり新しい procfs インスタンスを \fI/proc\fP
+にマウントすることができる。)
+
+このフラグを使用するためには、 カーネルでオプション \fBCONFIG_PID_NS\fP を有効になっていること、 プロセスが特権
+(\fBCAP_SYS_ADMIN\fP) を持っていることが必要である。 このフラグは \fBCLONE_THREAD\fP と組み合わせて使うことはできない。
+.TP
+\fBCLONE_NEWUTS\fP (Linux 2.6.19 以降)
+\fBCLONE_NEWUTS\fP が設定された場合、新しい UTS 名前空間でプロセスを作成する。 新しい UTS
+名前空間の識別子の初期値は、呼び出し元のプロセスの UTS 名前空間の識別子を複製したものとなる。 このフラグが設定されていない場合、
+(\fBfork\fP(2) の場合と同様) 呼び出し元のプロセスと同じ UTS 名前空間で プロセスが作成される。
+このフラグは、コンテナの実装での使用を意図して用意されたものである。
+
+UTS 名前空間は、 \fBuname\fP(2) が返す識別子の集合である。 識別子としてはドメイン名とホスト名があり、 それぞれ
+\fBsetdomainname\fP(2), \fBsethostname\fP(2) で修正することができる。 ある UTS
+名前空間における識別子の変更は同じ名前空間の他のすべての プロセスに見えるが、別の UTS 名前空間のプロセスには見えない。
+
+このフラグを使用するためには、 カーネルでオプション \fBCONFIG_UTS_NS\fP を有効になっていること、 プロセスが特権
+(\fBCAP_SYS_ADMIN\fP) を持っていることが必要である。
+.TP
+\fBCLONE_PARENT\fP (Linux 2.3.12 以降)
+\fBCLONE_PARENT\fP が設定された場合、新しい子供の (\fBgetppid\fP(2) で返される)
+親プロセスは呼び出し元のプロセスの親プロセスと同じになる。
+
+\fBCLONE_PARENT\fP が設定されていない場合、 (\fBfork\fP(2) と同様に) 呼び出し元のプロセスがその子供の親になる。
+
+子供が終了した時にシグナルが送られるのは \fBgetppid\fP(2) が返す親プロセスである点に注意すること。このため \fBCLONE_PARENT\fP
+が設定された場合、呼び出し元のプロセスではなく呼び出し元のプロセスの 親プロセスにシグナルが送られる。
+.TP
+\fBCLONE_PARENT_SETTID\fP (Linux 2.5.49 以降)
+親プロセスと子プロセスのメモリ内の \fIptid\fP が指す領域に子プロセスのスレッド ID を格納する。 (Linux 2.5.32\-2.5.48
+では、 同じことをする \fBCLONE_SETTID\fP というフラグが存在した。)
+.TP
+\fBCLONE_PID\fP (廃止予定)
+\fBCLONE_PID\fP が設定された場合、子プロセスは呼び出し元のプロセスと同じプロセス ID
+で作成される。これはシステムをハッキングするのには便利だが、 それ以外にはあまり使われない。 Linux 2.3.21 以降では、
+システムのブートプロセス (PID 0) だけがこのフラグを指定できる。 Linux 2.5.16 で削除された。
+.TP
+\fBCLONE_PTRACE\fP
+\fBCLONE_PTRACE\fP が指定され、かつ呼び出し元のプロセスが追跡 (trace) されていた場合、子プロセスも 同様に追跡される。
+(\fBptrace\fP(2) を参照のこと)
+.TP
+\fBCLONE_SETTLS\fP (Linux 2.5.32 以降)
+\fInewtls\fP 引き数は、新しい TLS (Thread Local Storage) ディスクリプタである。
+(\fBset_thread_area\fP(2) を参照のこと)
+.TP
+\fBCLONE_SIGHAND\fP
+\fBCLONE_SIGHAND\fP が設定された場合、呼び出し元のプロセスと子プロセスは同じシグナル・ハン
+ドラのテーブルを共有する。呼び出し元のプロセスまたは子プロセスのどちらかが \fBsigaction\fP(2)
+を呼び出してシグナルに対応する動作を変更した場合、 もう一方のプロセスのシグナル動作も変更される。 但し、呼び出し元のプロセスと子プロセスは、
+プロセス毎に、シグナル・マスク (signal mask) と処理待ちシグナルの集合 を持っている。このため、あるプロセスは、
+\fBsigprocmask\fP(2) を使用して、もう一方のプロセスに影響を与えずに シグナルを禁止 (block) したり許可 (unblock)
+したりできる。
+
+\fBCLONE_SIGHAND\fP が設定されていない場合、子プロセスは \fBclone\fP()
+が実行された時点での、呼び出し元のプロセスのシグナル・ハンドラの コピーを継承する。これ以降は、一方のプロセスが \fBsigaction\fP(2)
+を呼び出しても、もう一方のプロセスには影響を与えない。
+
+Linux 2.6.0\-test6 以降では、 \fBCLONE_SIGHAND\fP を指定する場合、 \fBCLONE_VM\fP も \fIflags\fP
+に含めなければならない。
+.TP
+\fBCLONE_STOPPED\fP (Linux 2.6.0\-test2 以降)
+\fBCLONE_STOPPED\fP が設定されると、子プロセスは最初 (\fBSIGSTOP\fP シグナルを送られたかのように) 停止した状態となる。
+子プロセスを再開させるには \fBSIGCONT\fP シグナルを送信しなければならない。
+
+.\" glibc 2.8 removed this defn from bits/sched.h
+このフラグは Linux 2.6.25 以降では\fI非推奨\fPであり、
+Linux 2.6.38 で完全に\fI削除\fPされた。
+.TP
+\fBCLONE_SYSVSEM\fP (Linux 2.5.10 以降)
+\fBCLONE_SYSVSEM\fP がセットされると、子プロセスと呼び出し元プロセスは一つの System V セマフォのアンドゥ値リスト
+(\fBsemop\fP(2) 参照) を共有する。このフラグがセットされていなければ、 子プロセスは独自のアンドゥリストを持つ
+(リストの初期値は空である)。
+.TP
+\fBCLONE_THREAD\fP (Linux 2.4.0\-test8以降)
+\fBCLONE_THREAD\fP が設定された場合、子プロセスは呼び出し元のプロセスと同じスレッド・グループに 置かれる。 \fBCLONE_THREAD\fP
+についての以降の議論を読みやすくするため、 「スレッド」という用語はスレッド・グループの中のプロセスを 参照するのに使うこととする。
+
+スレッド・グループは、 スレッド集合で一つの PID を共有するという POSIX スレッドの概念をサポートするために Linux 2.4
+に加えられた機能であった。 内部的には、この共有 PID はいわゆるそのスレッドグループの スレッド・グループ識別子 (TGID) である。 Linux
+2.4 以降では、 \fBgetpid\fP(2) の呼び出しではそのプロセスのスレッド・グループ ID を返す。
+
+あるグループに属するスレッドは (システム全体で) 一意なスレッド ID (TID) で区別できる。新しいスレッドの TID は \fBclone\fP()
+の呼び出し元へ関数の結果として返され、 スレッドは自分自身の TID を \fBgettid\fP(2) で取得できる。
+
+\fBCLONE_THREAD\fP を指定せずに \fBclone\fP() の呼び出しが行われると、 生成されたスレッドはそのスレッドの TID と同じ値の
+TGID を持つ 新しいスレッド・グループに置かれる。このスレッドは 新しいスレッド・グループの「リーダー」である。
+
+\fBCLONE_THREAD\fP を指定して作成された新しいスレッドは、 (\fBCLONE_PARENT\fP の場合と同様に) \fBclone\fP()
+を呼び出し元と同じ親プロセスを持つ。 そのため、 \fBgetppid\fP(2) を呼ぶと、一つのスレッド・グループに属すスレッドは全て同じ値を返す。
+\fBCLONE_THREAD\fP で作られたスレッドが終了した際に、 そのスレッドを \fBclone\fP() を使って生成したスレッドには
+\fBSIGCHLD\fP (もしくは他の終了シグナル) は送信されない。 また、 \fBwait\fP(2)
+を使って終了したスレッドの状態を取得することもできない (そのようなスレッドは \fIdetached\fP (分離された) といわれる)。
+
+スレッド・グループに属す全てのスレッドが終了した後、 そのスレッド・グループの親プロセスに \fBSIGCHLD\fP (もしくは他の終了シグナル)
+が送られる。
+
+スレッド・グループに属すいずれかのスレッドが \fBexecve\fP(2) を実行すると、スレッド・グループ・リーダー以外の全てのスレッドは
+終了され、新しいプロセスがそのスレッド・グループ・リーダーの下で 実行される。
+
+スレッド・グループに属すスレッドの一つが \fBfork\fP(2) を使って子プロセスを作成した場合、 スレッド・グループのどのスレッドであっても
+その子供を \fBwait\fP(2) できる。
+
+Linux 2.5.35 以降では、 \fBCLONE_THREAD\fP を指定する場合、 \fIflags\fP に \fBCLONE_SIGHAND\fP
+も含まれていなければならない。
+
+\fBkill\fP(2) を使ってスレッド・グループ全体 (つまり TGID) にシグナルを送ることもできれば、 \fBtgkill\fP(2)
+を使って特定のスレッド (つまり TID) にシグナルを送ることもできる。
+
+シグナルの配送と処理はプロセス全体に影響する: ハンドラを設定していないシグナルがあるスレッドに配送されると、
+そのシグナルはスレッド・グループの全メンバーに影響を及ぼす (終了したり、停止したり、動作を継続したり、無視されたりする)。
+
+各々のスレッドは独自のシグナルマスクを持っており、 \fBsigprocmask\fP(2) で設定できる。 だが、処理待ちのシグナルには、
+\fBkill\fP(2) で送信されるプロセス全体に対するもの (つまり、スレッド・グループの どのメンバーにも配送できるもの) と、
+\fBtgkill\fP(2) で送信される個々のスレッドに対するものがありえる。 \fBsigpending\fP(2)
+を呼び出すと、プロセス全体に対する処理待ちシグナルと呼び出し元の スレッドに対する処理待ちシグナルを結合したシグナル集合が返される。
+
+\fBkill\fP(2) を使ってスレッド・グループにシグナルが送られた場合で、 そのスレッド・グループがそのシグナルに対するシグナル・ハンドラが
+登録されていたときには、シグナル・ハンドラはスレッド・グループの メンバーのうち、ただ一つのスレッドでだけ起動される。ハンドラが
+起動されるスレッドは、そのシグナルを禁止 (block) していない メンバーの中から一つだけが勝手に (arbitrarily) 選ばれる。
+スレッド・グループに属す複数のスレッドが \fBsigwaitinfo\fP(2) を使って同じシグナルを待っている場合、
+これらのスレッドの中から一つをカーネルが勝手に選択し、 そのスレッドが \fBkill (2)\fP を使って送信されたシグナルを受信する。
+.TP
+\fBCLONE_UNTRACED\fP (Linux 2.5.46 以降)
+\fBCLONE_UNTRACED\fP が指定されると、 trace を行っているプロセスは この子プロセスに \fBCLONE_PTRACE\fP
+を適用することができない。
+.TP
+\fBCLONE_VFORK\fP
+\fBCLONE_VFORK\fP が設定された場合、 (\fBvfork\fP(2) と同様に) 子プロセスが \fBexecve\fP(2) または
+\fB_exit\fP(2) によって仮想メモリを解放するまで、呼び出し元のプロセスの実行は停止される。
+
+\fBCLONE_VFORK\fP が設定されていない場合、 \fBclone\fP() 呼び出し後は、呼び出し元のプロセスと子プロセスの
+両方がスケジュール対象となり、アプリケーションはこれらのプロセスの 実行順序に依存しないようにすべきである。
+.TP
+\fBCLONE_VM\fP
+\fBCLONE_VM\fP が設定された場合、呼び出し元のプロセスと子プロセスは同じメモリ空間で
+実行される。特に、呼び出し元のプロセスや子プロセスの一方がメモリに 書き込んだ内容はもう一方のプロセスからも見ることができる。さらに、
+子プロセスや呼び出し元のプロセスの一方が \fBmmap\fP(2) や \fBmunmap\fP(2) を使ってメモリをマップしたりアンマップした場合、
+もう一方のプロセスにも影響が及ぶ。
+
+\fBCLONE_VM\fP が設定されていない場合、子プロセスは \fBclone\fP() が実行された時点での、親プロセスのメモリ空間をコピーした
+別のメモリ空間で実行される。 一方のプロセスが行ったメモリへの書き込みや ファイルのマップ/アンマップは、 \fBfork\fP(2)
+の場合と同様、もう一方のプロセスには影響しない。
+.SS sys_clone
+\fBsys_clone\fP システムコールは、より \fBfork\fP(2) に近いかたちになっており、子プロセスの実行が呼び出しが行われた場所から
+続けられる。 そのため、 \fBsys_clone\fP が必要とする引き数は \fIflags\fP と \fIchild_stack\fP だけであり、それらは
+\fBclone\fP() と同じ意味を持つ (これらの引き数の順番は \fBclone\fP() とは異なることに注意せよ)。
+
+\fBsys_clone\fP のもう一つの違いは、 \fIchild_stack\fP 引き数がゼロでも良いことである。この場合には、どちらかのプロセスが
+スタックを変更した時に、書き込み時コピー (copy\-on\-write) 方式により
+子プロセスがスタック・ページの独立したコピーを得られることが保証される。 この場合、正常に動作させるためには、 \fBCLONE_VM\fP
+オプションを指定してはならない。
+
+Linux 2.4 以前では、 \fBclone\fP() は引き数 \fIptid\fP, \fItls\fP, \fIctid\fP を取らない。
+.SH 返り値
+.\" gettid(2) returns current->pid;
+.\" getpid(2) returns current->tgid;
+成功した場合、呼び出し元の実行スレッドには子プロセスのスレッドID が返される。 失敗した場合、 呼び出し元のコンテキストには \-1
+が返され、子プロセスは 作成されず、 \fIerrno\fP が適切に設定される。
+.SH エラー
+.TP
+\fBEAGAIN\fP
+すでに実行中のプロセスが多すぎる。
+.TP
+\fBEINVAL\fP
+\fBCLONE_SIGHAND\fP が指定されていたが、 \fBCLONE_VM\fP が指定されていなかった。 (Linux 2.6.0\-test6 以降)
+.TP
+\fBEINVAL\fP
+.\" .TP
+.\" .B EINVAL
+.\" Precisely one of
+.\" .B CLONE_DETACHED
+.\" and
+.\" .B CLONE_THREAD
+.\" was specified.
+.\" (Since Linux 2.6.0-test6.)
+\fBCLONE_THREAD\fP が指定されていたが、 \fBCLONE_SIGHAND\fP が指定されていなかった。 (Linux 2.5.35 以降)
+.TP
+\fBEINVAL\fP
+\fBCLONE_FS\fP と \fBCLONE_NEWNS\fP の両方が \fIflags\fP に指定された。
+.TP
+\fBEINVAL\fP
+\fBCLONE_NEWIPC\fP と \fBCLONE_SYSVSEM\fP の両方が \fIflags\fP に指定された。
+.TP
+\fBEINVAL\fP
+\fBCLONE_NEWPID\fP と \fBCLONE_THREAD\fP の両方が \fIflags\fP に指定された。
+.TP
+\fBEINVAL\fP
+\fIchild_stack\fP にゼロを指定した場合に \fBclone\fP() が返す。
+.TP
+\fBEINVAL\fP
+\fIflags\fP に \fBCLONE_NEWIPC\fP が指定されたが、カーネルでオプション \fBCONFIG_SYSVIPC\fP と
+\fBCONFIG_IPC_NS\fP が有効になっていなかった。
+.TP
+\fBEINVAL\fP
+\fIflags\fP に \fBCLONE_NEWNET\fP が指定されたが、カーネルでオプション \fBCONFIG_NET_NS\fP が有効になっていなかった。
+.TP
+\fBEINVAL\fP
+\fIflags\fP に \fBCLONE_NEWPID\fP が指定されたが、カーネルでオプション \fBCONFIG_PID_NS\fP が有効になっていなかった。
+.TP
+\fBEINVAL\fP
+\fIflags\fP に \fBCLONE_NEWUTS\fP が指定されたが、カーネルでオプション \fBCONFIG_UTS\fP が有効になっていなかった。
+.TP
+\fBENOMEM\fP
+子プロセスのために確保すべきタスク構造体や、呼び出し元のコンテキストの 一部をコピーするのに必要なメモリを十分に割り当てることができない。
+.TP
+\fBEPERM\fP
+非特権プロセス (\fBCAP_SYS_ADMIN\fP を持たないプロセス) が \fBCLONE_NEWIPC\fP, \fBCLONE_NEWNET\fP,
+\fBCLONE_NEWNS\fP, \fBCLONE_NEWPID\fP, \fBCLONE_NEWUTS\fP を指定した。
+.TP
+\fBEPERM\fP
+PID が 0 以外のプロセスによって \fBCLONE_PID\fP が指定された。
+.SH バージョン
+libc5 には \fBclone\fP() はない。glibc2 では \fBclone\fP() が提供されており、このマニュアルページに記載の通りである。
+.SH 準拠
+\fBclone\fP() と \fBsys_clone\fP コールは Linux 特有であり、移植を考慮したプログラムでは使用すべき ではない。
+.SH 注意
+カーネル 2.4.x 系列では、一般的には \fBCLONE_THREAD\fP フラグを指定しても新しいスレッドの親を
+呼び出し元プロセスの親と同じにはしない。 しかし、バージョン 2.4.7〜2.4.18 のカーネルでは、 (カーネル 2.6 と同じように)
+CLONE_THREAD フラグを指定すると、 暗黙のうちに CLONE_PARENT フラグを指定したことになる。
+
+\fBCLONE_DETACHED\fP というフラグが、2.5.32 で導入されて以来しばらくの間存在した。
+このフラグは親プロセスが子プロセス終了のシグナルを必要としないことを 表すものである。 2.6.2 で、 CLONE_DETATCHED を
+CLONE_THREAD と一緒に指定する必要はなくなった。 このフラグはまだ定義されているが、何の効果もない。
+
+i386 上では、 \fBclone\fP() は vsyscall 経由ではなく、直接 \fIint $0x80\fP 経由で呼び出すべきである。
+
+ia64 では、別のシステムコールが使用される:
+.nf
+
+\fBint __clone2(int (*\fP\fIfn\fP\fB)(void *), \fP
+\fB void *\fP\fIchild_stack_base\fP\fB, size_t \fP\fIstack_size\fP\fB,\fP
+\fB int \fP\fIflags\fP\fB, void *\fP\fIarg\fP\fB, ... \fP
+\fB /* pid_t *\fP\fIptid\fP\fB, struct user_desc *\fP\fItls\fP\fB, pid_t *\fP\fIctid\fP\fB */ );\fP
+.fi
+.PP
+\fB__clone2\fP() システムコールは \fBclone\fP() と同じように動作するが、以下の点が異なる:
+\fIchild_stack_base\fP は子プロセスのスタックエリアの最小のアドレスを指し、 \fIstack_size\fP は
+\fIchild_stack_base\fP が指し示すスタックエリアの大きさを示す。
+.SH バグ
+NPTL スレッド・ライブラリを含んでいる GNU C ライブラリのいくつかのバージョン には、 \fBgetpid\fP(2)
+のラッパー関数が含まれており、このラッパー関数は PID をキャッシュする。 このキャッシュ処理が正しく動作するためには glibc の
+\fBclone\fP() のラッパー関数での助けが必要だが、現状の実装では、 ある状況下においてキャッシュが最新とならない可能性がある。 特に、
+\fBclone\fP() の呼び出し直後にシグナルが子プロセスに配送された場合に、 そのシグナルに対するハンドラ内で \fBgetpid\fP(2)
+を呼び出すと、それまでに clone のラッパー関数が子プロセスの PID キャッシュを 更新する機会が得られていなければ、呼び出し元プロセス
+("親プロセス") の PID が 返される可能性がある。 (この議論では、子プロセスが \fBCLONE_THREAD\fP
+を使って作成された場合のことは無視している。 子プロセスが \fBCLONE_THREAD\fP を作って作成された場合には、
+呼び出し元と子プロセスは同じスレッド・グループに属すので、 \fBgetpid\fP(2) は子プロセスと \fBclone\fP()
+を呼び出したプロセスで同じ値を返すのが「正しい」。 キャッシュが最新とならない問題 (stale\-cache problem) は、 \fIflags\fP
+に \fBCLONE_VM\fP が含まれている場合にも発生しない。) 本当の値を得るためには、次のようなコードを使う必要があるかもしれない。
+.nf
+
+ #include <syscall.h>
+
+ pid_t mypid;
+
+ mypid = syscall(SYS_getpid);
+.fi
+.\" See also the following bug reports
+.\" https://bugzilla.redhat.com/show_bug.cgi?id=417521
+.\" http://sourceware.org/bugzilla/show_bug.cgi?id=6910
+.SH 関連項目
+\fBfork\fP(2), \fBfutex\fP(2), \fBgetpid\fP(2), \fBgettid\fP(2), \fBset_thread_area\fP(2),
+\fBset_tid_address\fP(2), \fBtkill\fP(2), \fBunshare\fP(2), \fBwait\fP(2),
+\fBcapabilities\fP(7), \fBpthreads\fP(7)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" t
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" 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.
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\" Modified 1993-07-24 by Rik Faith <faith@cs.unc.edu>
+.\" Modified 1995-09-26 by Andries Brouwer <aeb@cwi.nl>
+.\" and again on 960413 and 980804 and 981223.
+.\" Modified 1998-12-11 by Jamie Lokier <jamie@imbolc.ucc.ie>
+.\" Applied correction by Christian Ehrhardt - aeb, 990712
+.\" Modified 2002-04-23 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Added note on F_SETFL and O_DIRECT
+.\" Complete rewrite + expansion of material on file locking
+.\" Incorporated description of F_NOTIFY, drawing on
+.\" Stephen Rothwell's notes in Documentation/dnotify.txt.
+.\" Added description of F_SETLEASE and F_GETLEASE
+.\" Corrected and polished, aeb, 020527.
+.\" Modified 2004-03-03 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Modified description of file leases: fixed some errors of detail
+.\" Replaced the term "lease contestant" by "lease breaker"
+.\" Modified, 27 May 2004, Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Added notes on capability requirements
+.\" Modified 2004-12-08, added O_NOATIME after note from Martin Pool
+.\" 2004-12-10, mtk, noted F_GETOWN bug after suggestion from aeb.
+.\" 2005-04-08 Jamie Lokier <jamie@shareable.org>, mtk
+.\" Described behavior of F_SETOWN/F_SETSIG in
+.\" multithreaded processes, and generally cleaned
+.\" up the discussion of F_SETOWN.
+.\" 2005-05-20, Johannes Nicolai <johannes.nicolai@hpi.uni-potsdam.de>,
+.\" mtk: Noted F_SETOWN bug for socket file descriptor in Linux 2.4
+.\" and earlier. Added text on permissions required to send signal.
+.\" 2009-09-30, Michael Kerrisk
+.\" Note obsolete F_SETOWN behavior with threads.
+.\" Document F_SETOWN_EX and F_GETOWN_EX
+.\" 2010-06-17, Michael Kerrisk
+.\" Document F_SETPIPE_SZ and F_GETPIPE_SZ.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH FCNTL 2 2012\-04\-15 Linux "Linux Programmer's Manual"
+.SH 名前
+fcntl \- ファイルディスクリプタの操作を行う
+.SH 書式
+.nf
+\fB#include <unistd.h>\fP
+\fB#include <fcntl.h>\fP
+.sp
+\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() はオプションとして第三引き数をとることができる。 第三引き数が必要
+かどうかは \fIcmd\fP により決まる。必要な引き数の型は \fIcmd\fP 名の後ろの括弧内で
+指定されている (ほとんどの場合、必要な型は \fIint\fP であり、この引き数を表すの
+に \fIarg\fP という名前を使っている)。引き数が必要ない場合には \fIvoid\fP が指定さ
+れている。
+.SS ファイルディスクリプタの複製
+.TP
+\fBF_DUPFD\fP (\fIint\fP)
+利用可能なファイルディスクリプタのうち、 \fIarg\fP 以上で最小のものを探し、 \fIfd\fP のコピーとする。これは別の形の \fBdup2\fP(2)
+である。 \fBdup2\fP(2) では指定されたディスクリプタが使われる点が違う。
+.IP
+成功すると、新しいディスクリプタが返される。
+.IP
+詳細は \fBdup\fP(2) を参照のこと。
+.TP
+\fBF_DUPFD_CLOEXEC\fP (\fIint\fP; Linux 2.6.24 以降)
+\fBF_DUPFD\fP と同様だが、それに加えて複製されたディスクリプタに対して close\-on\-exec フラグをセットする。
+このフラグを指定することで、プログラムは \fBFD_CLOEXEC\fP フラグをセットするために \fBfcntl\fP() の \fBF_SETFD\fP
+操作を追加で行う必要がなくなる。 このフラグがなぜ有用かについては、 \fBopen\fP(2) の \fBO_CLOEXEC\fP の説明を参照のこと。
+.SS ファイルディスクリプタ・フラグ
+以下のコマンドを使って、ファイルディスクリプタに関連するフラグ を操作することができる。 現在のところ、定義されているフラグは一つだけである:
+\fBFD_CLOEXEC\fP (close\-on\-exec フラグ)。 \fBFD_CLOEXEC\fP ビットが 0 なら、ファイルディスクリプタは
+\fBexecve\fP(2) を行ってもオープンされたままだが、そうでない場合はクローズされる。
+.TP
+\fBF_GETFD\fP (\fIvoid\fP)
+ファイルディスクリプタ・フラグを読み出す。 \fIarg\fP は無視される。
+.TP
+\fBF_SETFD\fP (\fIint\fP)
+ファイルディスクリプタ・フラグに \fIarg\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) などで) 複製されたファイルディスクリプタ同士は 同じオープンファイル記述を参照する。
+そのため、 同じファイル状態フラグが共有される。
+
+ファイル状態フラグとその意味は \fBopen\fP(2) で説明されている。
+.TP
+\fBF_GETFL\fP (\fIvoid\fP)
+ファイルのアクセスモードとファイル状態フラグを取得する。
+\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
+は、以下に示すフィールドを含む構造体へのポインタである (フィールドの順序は関係なく、構造体に他のフィールドがあってもよい)。
+.in +4n
+.nf
+.sp
+struct flock {
+ ...
+ short l_type; /* Type of lock: F_RDLCK,
+ F_WRLCK, F_UNLCK */
+ short l_whence; /* How to interpret l_start:
+ SEEK_SET, SEEK_CUR, SEEK_END */
+ 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) */
+ ...
+};
+.fi
+.in
+.P
+この構造体の \fIl_whence\fP, \fIl_start\fP, \fIl_len\fP フィールドで、ロックを行いたいバイト範囲を指定する。
+ファイルの末尾より後ろのバイトをロックすることはできるが、 ファイルの先頭より前のバイトをロックすることはできない。
+
+\fIl_start\fP はロックを行う領域の開始オフセットである。 その意味は \fIl_whence\fP により異なる: \fIl_whence\fP が
+\fBSEEK_SET\fP の場合はファイルの先頭からのオフセット、 \fIl_whence\fP が \fBSEEK_CUR\fP
+の場合は現在のファイルオフセットからのオフセット、 \fIl_whence\fP が \fBSEEK_END\fP
+の場合はファイルの末尾からのオフセットと解釈される。 後ろの2つの場合には、 ファイルの先頭より前にならない範囲で、 \fIl_start\fP
+に負の値を指定することができる。
+
+\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 で指定される位置からファイルの末尾までの全てのバイトをロックする
+(ファイルがどんなに大きくなったとしてもファイルの末尾までロックする)。
+
+POSIX.1\-2001 では、負の値の \fIl_len\fP をサポートする実装を認めている (必須ではない)。 \fIl_len\fP
+が負の場合、ロックされるバイト範囲は \fIl_start\fP+\fIl_len\fP 以上 \fIl_start\fP\-1 以下となる。 この動作はカーネル
+2.4.21 以降および 2.5.49 以降の Linux で サポートされている。
+
+\fIl_type\fP フィールドは、ファイルに対して読み出しロック (\fBF_RDLCK\fP) と書き込みロック (\fBF_WRLCK\fP) のどちらを
+設定するかを指定する。 ファイルのある領域に対して、読み出しロック (共有ロック) を保持できる プロセス数に制限はないが、書き込みロック
+(排他ロック) を保持できる のは一つのプロセスだけである。排他ロックを設定すると、(共有ロックか 排他ロックにかかわらず)
+他のロックは何も設定できない。 一つのプロセスは、ファイルのある領域に対して一種類のロックしか保持できない。
+新規のロックがロックが設定されている領域に対して適用されると、既存のロック は新規のロックの種別に変換される
+(新規のロックで指定されたバイト範囲が既存ロックの範囲と一致する場合以外では、 変換の過程で既存のロックの分割、縮小、結合が行われることがある)。
+.TP
+\fBF_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 に
+\fBEACCES\fP か \fBEAGAIN\fP を設定する。
+.TP
+\fBF_SETLKW\fP (\fIstruct flock *\fP)
+\fBF_SETLK\fP と同様だが、こちらではそのファイルに対して衝突するロックが 適用されていた場合に、そのロックが解放されるのを待つ点が異なる。
+待っている間にシグナルを受けた場合は、システムコールは中断され、 (シグナルハンドラが戻った直後に) 返り値 \-1 を返す (また \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
+を設定して、復帰する。
+.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 すると、そのファイルへのロックが失われることになる。
+.P
+レコードのロックは \fBfork\fP(2) で作成された子プロセスには継承されないが、 \fBexecve\fP(2) の前後では保存される。
+.P
+\fBstdio\fP(3) ではバッファリングが行われるので、 stdio 関連の関数ではレコードのロックの使用は回避される; 代わりに
+\fBread\fP(2) や \fBwrite\fP(2) を使用すること。
+.SS "強制ロック (mandatory locking)"
+上述のロックにはアドバイザリ・ロック (advisory lock) と強制ロック (mandatory lock)
+の二種類があるが、デフォルトではアドバイザリ・ロックとなる。
+
+アドバイザリ・ロックに強制力はなく、協調して動作するプロセス間でのみ 有効である。
+
+強制ロックは全てのプロセスに対して効果がある。 あるプロセスが互換性のない強制ロックが適用されたファイル領域に対して (\fBread\fP(2) や
+\fBwrite\fP(2) により) 互換性のないアクセスを実行しようとした場合、 アクセスの結果は そのファイルのオープンファイル記述で
+\fBO_NONBLOCK\fP フラグが有効になっているかにより決まる。 \fBO_NONBLOCK\fP
+フラグが有効になっていないときは、ロックが削除されるか、 ロックがアクセスと互換性のあるモードに変換されるまで、 システムコールは停止 (block)
+される。 \fBO_NONBLOCK\fP フラグが有効になっているときは、システムコールはエラー \fBEAGAIN\fP で失敗する。
+
+強制ロックを使用するためには、ロック対象のファイルが含まれるファイルシステム
+と、ロック対象のファイル自身の両方について、強制ロックが有効になっていなけれ ばならない。ファイルシステムについて強制ロックを有効にするには、
+\fBmount\fP(8) に "\-o mand" オプションを渡すか、 \fBmount\fP(2) に \fBMS_MANDLOCK\fP
+フラグを指定する。ファイルについて強制ロックを有効にするには、 そのファイルのグループ実行許可 (group execute permission)
+を無効とし、 かつ set\-group\-ID 許可ビットを有効にする (\fBchmod\fP(1) と \fBchmod\fP(2) を参照)。
+
+Linux の強制ロックの実装は信頼性に欠けるものである。 下記の「バグ」の節を参照のこと。
+.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
+かプロセスグループを (関数の結果として) 返す。 プロセスID は正の値として返される。 プロセスグループID は負の値として返される
+(下記のバグの章を参照)。 \fIarg\fP は無視される。
+.TP
+\fBF_SETOWN\fP (\fIint\fP)
+ファイルディスクリプタ \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
+状態フラグを設定した場合には、そのファイルディスクリプタへの 入出力が可能になる度に \fBSIGIO\fP シグナルが送られる。 \fBF_SETSIG\fP は
+\fBSIGIO\fP 以外の別のシグナルの配送を受けられるように するのにも使うことができる。 許可 (permission)
+のチェックで失敗した場合には、 シグナルは黙って捨てられる。
+
+\fBF_SETOWN\fP により指定された所有者のプロセス (またはプロセスグループ) に シグナルを送る際には、 \fBkill\fP(2)
+に書かれているのと同じ許可のチェックが行われる。 このとき、シグナルを送信するプロセスは \fBF_SETOWN\fP を使ったプロセスである
+(但し、下記の「バグ」の章を参照のこと)。
+
+.\" The following appears to be rubbish. It doesn't seem to
+.\" be true according to the kernel source, and I can write
+.\" a program that gets a terminal-generated SIGIO even though
+.\" it is not the foreground process group of the terminal.
+.\" -- MTK, 8 Apr 05
+.\"
+.\" If the file descriptor
+.\" .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)
+データが届いた時に \fBSIGURG\fP シグナルを配送する相手を選択することもできる (\fBSIGURG\fP が送られた場合には \fBselect\fP(2)
+がソケットが「特別な状態」にあると報告することだろう)。
+
+バージョン 2.6.11 以前の 2.6.x カーネルでは、以下に示す動作であった。
+.RS
+.IP
+.\" The relevant place in the (2.6) kernel source is the
+.\" 'switch' in fs/fcntl.c::send_sigio_to_task() -- MTK, Apr 2005
+.\" send_sigurg()/send_sigurg_to_task() bypasses
+.\" kill_fasync()/send_sigio()/send_sigio_to_task()
+.\" to directly call send_group_sig_info()
+.\" -- MTK, Apr 2005 (kernel 2.6.11)
+スレッドグループをサポートしているスレッドライブラリ (例えば NPTL) を 使って動作しているマルチスレッド・プロセスで \fBF_SETSIG\fP に
+0 以外の値を指定した場合、 \fBF_SETOWN\fP に正の値を渡すと、その意味が違ってくる: プロセス全体を示すプロセスID
+ではなく、プロセス内の特定の スレッドを示すスレッドID と解釈される。 したがって、 \fBF_SETSIG\fP
+を使う場合には、きちんと結果を受け取るには、 \fBF_SETOWN\fP に渡す値を \fBgetpid\fP(2) ではなく \fBgettid\fP(2)
+の返り値にする必要があるだろう。 (現状の Linux スレッド実装では、メイン・スレッドのスレッドID は そのスレッドのプロセスID
+と同じである。つまり、 シグナル・スレッドのプログラムではこの場合 \fBgettid\fP(2) と \fBgetpid\fP(2)
+は全く同じように使うことができる。) ただし、注意すべき点として、この段落で述べたことは、 ソケットの帯域外データが届いたときに生成される
+\fBSIGURG\fP シグナルにはあてはまらない。 このシグナルは常にプロセスかプロセスグループに送られ、 送信先は \fBF_SETOWN\fP
+に渡された値にしたがって決められる。
+.RE
+.IP
+上記の動作は、Linux 2.6.12 で図らずも削除され、 元に戻されない予定である。 Linux 2.6.32 以降で、特定のスレッド宛にシグナル
+\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
+が指す構造体に格納されて返される。構造体は以下の通りである。
+.nf
+.in +4n
+
+struct f_owner_ex {
+ int type;
+ pid_t pid;
+};
+
+.in
+.fi
+\fItype\fP フィールドは、 \fBF_OWNER_TID ,\fP \fBF_OWNER_PID ,\fP \fBF_OWNER_PGRP\fP
+のいずれか一つの値となる。 \fIpid\fP フィールドは、スレッド ID、プロセス ID、プロセスグループ ID を 表す正の整数である。詳細は
+\fBF_SETOWN_EX\fP を参照。
+.TP
+\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 フィールドは以下のいずれかの値を取り、 この値により
+\fIpid\fP がどのように解釈されるかが規定される。
+.RS
+.TP
+\fBF_OWNER_TID\fP
+スレッド ID が \fIpid\fP で指定された値のスレッドにそのシグナルを送る (スレッド ID は \fBclone\fP(2) や
+\fBgettid\fP(2) の呼び出しで返される値である)。
+.TP
+\fBF_OWNER_PID\fP
+ID が \fIpid\fP で指定された値のプロセスにそのシグナルを送る。
+.TP
+\fBF_OWNER_PGRP\fP
+ID が \fIpid\fP で指定された値のプロセスグループにそのシグナルを送る。 (\fBF_SETOWN\fP と異なり、プロセスグループ ID
+には正の値を指定する点に注意すること。)
+.RE
+.TP
+\fBF_GETSIG\fP (\fIvoid\fP)
+入力や出力が可能になった場合に送るシグナルを (関数の結果として) 返す。 値ゼロは \fBSIGIO\fP を送ることを意味する。 (\fBSIGIO\fP
+を含む) 他の値はいずれも、 \fBSIGIO\fP の代わりに送るシグナル番号を表す。 後者の場合、シグナルハンドラを \fBSA_SIGINFO\fP
+フラグ付きで設定すれば、ハンドラで追加の情報を得ることができる。 \fIarg\fP は無視される。
+.TP
+\fBF_SETSIG\fP (\fIint\fP)
+.\"
+.\" The following was true only up until 2.6.11:
+.\"
+.\" Additionally, passing a nonzero value to
+.\" .B F_SETSIG
+.\" changes the signal recipient from a whole process to a specific thread
+.\" within a process.
+.\" See the description of
+.\" .B F_SETOWN
+.\" for more details.
+入力や出力が可能になった場合に送るシグナルを \fIarg\fP に指定された値に設定する。 値ゼロは \fBSIGIO\fP を送ることを意味する。
+(\fBSIGIO\fP を含む) 他の値はいずれも、 \fBSIGIO\fP の代わりに送るシグナル番号を表す。 後者の場合、シグナルハンドラを
+\fBSA_SIGINFO\fP フラグ付きで設定すれば、 ハンドラで追加の情報を得ることができる。
+
+\fBF_SETSIG\fP にゼロ以外の値を設定し、シグナルハンドラに \fBSA_SIGINFO\fP フラグを設定すると、 (\fBsigaction\fP(2)
+を参照) I/O イベントに関する追加の情報が \fIsiginfo_t\fP 構造体でシグナルハンドラへ渡される。 \fIsi_code\fP
+フィールドが示すシグナルの原因が \fBSI_SIGIO\fP である場合、 \fIsi_fd\fP
+フィールドにはイベントに対応するファイルディスクリプタが入っている。 それ以外の場合は、どのファイルディスクリプタが利用可能かを示す情報は
+ないので、どのファイルディスクリプタで I/O が可能かを判断するためには 通常の機構 (\fBselect\fP(2), \fBpoll\fP(2),
+\fBO_NONBLOCK\fP を設定した \fBread\fP(2) など) を使用しなければならない。
+
+リアルタイムシグナル (値が \fBSIGRTMIN\fP 以上) を選択している場合は、 同じシグナル番号を持つ複数の I/O
+イベントがキューに入ることがある (キューに入れるかどうかは利用可能なメモリに依存している)。 上記と同様、 \fBSA_SIGINFO\fP
+が設定されている場合、シグナルハンドラのための追加の情報が得られる。
+
+.\" See fs/fcntl.c::send_sigio_to_task() (2.4/2.6) sources -- MTK, Apr 05
+以下の点に注意すること。 Linux では一つのプロセスに対してキューに入れられるリアルタイム シグナルの数に上限が設けられており
+(\fBgetrlimit\fP(2) と \fBsignal\fP(7) を参照)、この上限に達するとカーネルは \fBSIGIO\fP シグナルを配送する。この
+\fBSIGIO\fP シグナルは、指定されたスレッドではなくプロセス全体に送られる。
+.PP
+これらの機構を使用することで、ほとんどの場合で \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)
+の一部として これらも利用可能である。
+.SS "リース (leases)"
+(Linix 2.4 以降で利用可能) \fBF_SETLEASE\fP は、 \fIfd\fP
+が参照するオープンファイル記述に対して新しいリースを設定するのに使用される。 \fBF_GETLEASE\fP は、 \fIfd\fP
+が参照するオープンファイル記述に対して設定されている 現在のリースを取得するのに使用される。 ファイルのリースにより、 あるプロセス ("lease
+breaker") がそのファイルディスクリプタが参照 しているファイルに対して \fBopen\fP(2) や \fBtruncate\fP(2)
+を行おうとした際に、リースを保持しているプロセス ("lease holder") へ (シグナルの配送による) 通知が行われるという機構が提供される。
+.TP
+\fBF_SETLEASE\fP (\fIint\fP)
+\fIarg\fP の内容に基いてファイルのリースの設定、削除を行う。整数 \fIarg\fP には以下の値が指定できる:
+.RS
+.TP
+\fBF_RDLCK\fP
+.\" The following became true in kernel 2.6.10:
+.\" See the man-pages-2.09 Changelog for further info.
+読み出しリースを取得する。これにより、 そのファイルが書き込み用にオープンされたり、ファイルが切り詰められた場合に、
+呼び出し元のプロセスに通知が行われるようになる。 読み出しリースを設定できるのは、読み出し専用でオープンされている
+ファイルディスクリプタに対してのみである。
+.TP
+\fBF_WRLCK\fP
+書き込みリースを取得する。これにより、 (読み出し用か書き込み用にかかわらず) そのファイルがオープンされたり、
+ファイルが切り詰められた場合に、呼び出し元のプロセスに通知が行われるようになる。
+書き込みリースは、そのファイルに対するオープンされたファイルディスクリプタが 他にない場合にのみ設定できる。
+.TP
+\fBF_UNLCK\fP
+そのファイルからリースを削除する。
+.RE
+.P
+リースはオープンファイル記述に対して関連付けられる (\fBopen\fP(2) 参照)。 つまり、 (\fBfork\fP(2) や \fBdup\fP(2)
+などにより作成された) ファイルディスクリプタの複製は同じリースを参照し、 複製も含めたどのファイルディスクリプタを使ってもこのリースを変更したり
+解放したりできる。 また、これらのファイルディスクリプタのいずれかに対して \fBF_UNLCK\fP
+操作が明示的に実行された場合や、すべてのファイルディスクリプタが 閉じられた場合にも、リースは解放される。
+.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 は無視される。
+.PP
+あるプロセス ("lease breaker") が \fBF_SETLEASE\fP で設定されたリースと矛
+盾するような \fBopen\fP(2) や \fBtruncate\fP(2) を実行した場合、 そのシステム
+コールはカーネルによって停止され、 カーネルは lease holder にシグナル
+(デフォルトでは \fBSIGIO\fP) を送って通知を行う。 lease holder はこのシグ
+ナルを受信したときにはきちんと対応すべきである。 具体的には、別のプロセ
+スがそのファイルにアクセスするための準備として 必要な後片付け (例えば、
+キャッシュされたバッファのフラッシュ) を すべて行ってから、そのファイル
+のリースの削除または格下げを行う。リースを削除をするには、 \fIarg\fP に
+\fBF_UNLCK\fP を指定して \fBF_SETLEASE\fP を実行する。lease holder がファイル
+に書き込みリースを保持していて、 lease breaker が読み出し用にそのファイ
+ルをオープンしている場合、 lease holder が保持しているリースを読み出し
+リースに格下げすれば 十分である。これをするには、 \fIarg\fP に \fBF_RDLCK\fP
+を指定して \fBF_SETLEASE\fP を実行する。
+
+lease holder が \fI/proc/sys/fs/lease\-break\-time\fP
+で指定された秒数以内にリースの格下げか削除を行えなかった場合、 カーネルは強制的にその lease holder のリースを削除もしくは格下げを行う。
+
+いったん lease break が開始されると、 lease holder が自発的にそのリース
+の格下げか削除を行うか、lease break timer の満了後にカーネルが強制的に
+リースの格下げか削除を行うまで、 \fBF_GETLEASE\fP は対象となるリースの型を
+返す (リースの型は \fBF_RDLCK\fP か \fBF_UNLCK\fP のどちらであり、lease
+breaker と互換性のある型となる)。
+
+一度リースの削除か格下げが自発的もしくは強制的に行われると、 lease breaker がまだシステムコールを再開していない場合には、 カーネルが
+lease breaker のシステムコールの続行を許可する。
+
+lease breaker が実行した \fBopen\fP(2) や \fBtruncate\fP(2) が停止中にシグナルハンドラにより中断された場合、
+そのシステムコールは \fBEINTR\fP エラーで失敗するが、上で述べた他の処理は そのまま行われる。 \fBopen\fP(2) や
+\fBtruncate\fP(2) が停止中に lease breaker がシグナルにより kill された場合、 上で述べた他の処理はそのまま行われる。
+lease breaker が \fBopen\fP(2) を呼ぶ際に \fBO_NONBLOCK\fP フラグを指定した場合、そのシステムコールは
+\fBEWOULDBLOCK\fP エラーで直ちに失敗するが、上で述べた他の処理はそのまま行われる。
+
+lease holder への通知に使われるデフォルトのシグナルは \fBSIGIO\fP だが、 \fBfcntl\fP() の \fBF_SETSIG\fP
+コマンドで変更することができる。 \fBF_SETSIG\fP コマンドが実行され (\fBSIGIO\fP を指定された場合も含む)、 \fBSA_SIGINFO\fP
+フラグ付きでシグナルハンドラが設定されている場合には、 ハンドラの第二引き数として \fIsiginfo_t\fP 構造体が渡され、この引き数の
+\fIsi_fd\fP フィールドには別のプロセスがアクセスしたリース設定済みファイルの ディスクリプタが入っている
+(この機能は複数のファイルに対してリースを設定する場合に有用である)。
+.SS "ファイルやディレクトリの変更の通知 (dnotify)"
+.TP
+\fBF_NOTIFY\fP (\fIint\fP)
+(Linux 2.4 以降) \fIfd\fP で参照されるディレクトリか、その中にあるファイルに変更があった場合に 通知を行う。どのイベントを通知するかは
+\fIarg\fP で指定する。 \fIarg\fP はビットマスクで、以下のビットの 0個以上の論理和をとったものを指定する。
+.RS
+.sp
+.PD 0
+.TP 12
+\fBDN_ACCESS\fP
+ファイルへのアクセスがあった (read, pread, readv)
+.TP
+\fBDN_MODIFY\fP
+ファイルの内容が変更された (write, pwrite, writev, truncate, ftruncate).
+.TP
+\fBDN_CREATE\fP
+ファイルが作成された (open, creat, mknod, mkdir, link, symlink, rename).
+.TP
+\fBDN_DELETE\fP
+ファイルが削除 (unlink) された (unlink, 別のディレクトリへの rename, rmdir)
+.TP
+\fBDN_RENAME\fP
+ディレクトリ内でのファイル名の変更があった (rename)
+.TP
+\fBDN_ATTRIB\fP
+ファイル属性が変更された (chown, chmod, utime[s])
+.PD
+.RE
+.IP
+(上記の定義を利用するには、\fIどの\fP ヘッダファイルをインクルードするより前に、
+\fB_GNU_SOURCE\fP 機能検査マクロを定義しなければならない。)
+
+ディレクトリの変更通知は通常「一回限り (one\-shot)」であり、 アプリケーション側でその後さらに通知を受信したい場合は
+再登録しなければならない。 \fIarg\fP に \fBDN_MULTISHOT\fP が含まれていた場合には、
+変更通知は明示的に解除されるまで有効状態が継続する。
+
+.\" The following does seem a poor API-design choice...
+\fBF_NOTIFY\fP 要求は積算されていく。つまり、 \fIarg\fP で指定されたイベントがすでにモニタされている イベント集合に加算される形になる。
+すべてのイベントの通知を無効にするには、 \fIarg\fP に 0 を指定して \fBF_NOTIFY\fP を呼び出す必要がある。
+
+通知はシグナルの配送で行われる。 デフォルトのシグナルは \fBSIGIO\fP だが、 \fBfcntl\fP() の \fBF_SETSIG\fP
+コマンドで変更することができる。 後者の場合には、 (\fBSA_SIGINFO\fP フラグ付きでシグナルハンドラが設定されている場合には)
+ハンドラの第二引き数として \fIsiginfo_t\fP 構造体が渡され、この構造体の \fIsi_fd\fP
+フィールドには通知の行われたファイルディスクリプタが入っている (この機能は複数のディレクトリに対して通知を設定する場合に有用である)。
+
+特に \fBDN_MULTISHOT\fP を使う場合は、通知にはリアルタイムシグナルを使うべきである。
+それは、リアルタイムシグナルを使うことで、複数の通知をキューに入れる ことができるからである。
+
+\fB注意:\fP 新しくアプリケーションを書く際には、(カーネル 2.6.13 以降で利用可能となった) \fIinotify\fP
+インタフェースを使用すべきである。 \fIinotify\fP はファイルシステムイベントの通知を取得するための ずっと優れたインタフェースである。
+\fBinotify\fP(7) を参照。
+.SS パイプの容量の変更
+.TP
+\fBF_SETPIPE_SZ\fP (\fIint\fP; Linux 2.6.35 以降)
+\fIfd\fP が参照するパイプの容量を少なくとも \fIarg\fP バイトに変更する。
+非特権プロセスは、パイプの容量として、
+システムのページサイズと \fI/proc/sys/fs/pipe\-max\-size\fP で定義される
+上限値 (\fBproc\fP(5) 参照) の間の任意の値を設定できる。
+パイプの容量をページサイズよりも小さな値に設定しようとした場合は、
+暗黙のうちにページサイズに切り上げられる。
+非特権プロセスがパイプの容量を \fI/proc/sys/fs/pipe\-max\-size\fP で定義
+された上限より大きな値に設定しようとした場合は、エラー \fBEPERM\fP が
+発生する。特権プロセス (\fBCAP_SYS_RESOURCE\fP ケーパビリティを持つ
+プロセス) はこの上限を上書きできる。
+パイプにバッファを割り当てる場合、実装側の都合に応じて、
+カーネルは \fIarg\fP よりも大きな容量を割り当ててもよい。
+\fBF_GETPIPE_SZ\fP 操作では実際に使用されている大きさが返される。
+パイプの容量を現在データを格納するのに使用されているバッファの
+サイズよりも小さくしようとした場合は、エラー \fBEBUSY\fP が発生する。
+.TP
+\fBF_GETPIPE_SZ\fP (\fIvoid\fP; Linux 2.6.35 以降)
+\fIfd\fP が参照するパイプの容量を (関数の結果として) 返す。
+.SH 返り値
+成功した場合の返り値は操作の種類により違う:
+.TP 0.9i
+\fBF_DUPFD\fP
+新しいディスクリプタを返す。
+.TP
+\fBF_GETFD\fP
+ファイルディスクリプタ・フラグの値
+.TP
+\fBF_GETFL\fP
+ファイル状態フラグの値
+.TP
+\fBF_GETLEASE\fP
+ファイルディスクリプタに対して保持されているリースの種別を返す。
+.TP
+\fBF_GETOWN\fP
+ディスクリプタの所有者を返す。
+.TP
+\fBF_GETSIG\fP
+読み込みや書き出しが可能になった時に送られるシグナルの値、もしくは 伝統的な \fBSIGIO\fP 動作の場合にはゼロを返す。
+.TP
+\fBF_GETPIPE_SZ\fP
+パイプの容量。
+.TP
+他の全てのコマンド
+0 を返す。
+.PP
+エラーの時は \-1 が返され、 \fIerrno\fP に適切な値が設定される。
+.SH エラー
+.TP
+\fBEACCES\fP か \fBEAGAIN\fP
+他のプロセスが保持しているロックによって操作が禁止されている。
+.TP
+\fBEAGAIN\fP
+そのファイルは他のプロセスによってメモリ・マップされているため、 操作が禁止されている。
+.TP
+\fBEBADF\fP
+\fIfd\fP がオープンされたファイルディスクリプタでない。 あるいはコマンドが \fBF_SETLK\fP または \fBF_SETLKW\fP
+だったが、対象のファイルディスクリプタのオープンモードが 必要となるロックの型にマッチしていない。
+.TP
+\fBEDEADLK\fP
+指定された \fBF_SETLKW\fP コマンドを実行した場合にはデッドロックになることが検出された。
+.TP
+\fBEFAULT\fP
+\fIlock\fP が利用可能なアドレス空間の外部にある。
+.TP
+\fBEINTR\fP
+\fBF_SETLKW\fP コマンドがシグナルにより割り込まれた (\fBsignal\fP(7) 参照)。 \fBF_GETLK\fP と \fBF_SETLK\fP
+の場合、ロックを確認したり取得したりする前にシグナルによって割り込まれた。 これはたいていリモートのファイルをロックする場合 (例えば NFS
+上でロックする場合) に起こる。 しかしローカルでも起こる場合がある。
+.TP
+\fBEINVAL\fP
+\fBF_DUPFD\fPで、 \fIarg\fP が負か、もしくは許される最大値よりも大きい。 \fBF_SETSIG\fP の場合、 \fIarg\fP
+が利用可能なシグナル番号ではない。
+.TP
+\fBEMFILE\fP
+\fBF_DUPFD\fPで、 プロセスがすでに最大数までファイルディスクリプタをオープンしている。
+.TP
+\fBENOLCK\fP
+オープンされているロックの数が多過ぎて、ロック・テーブルがいっぱいである。 または remote locking protocol (例えば NFS
+上のロック) が失敗した。
+.TP
+\fBEPERM\fP
+追加専用属性が設定されたファイルの \fBO_APPEND\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_DUPFD_CLOEXEC\fP は POSIX.1\-2008 で規定されている。
+(これら定義するには、
+\fB_POSIX_C_SOURCE\fP を 200809L 以上の値で定義するか、
+\fB_XOPEN_SOURCE\fP を 700 以上の値で定義すること。)
+
+.\" .PP
+.\" SVr4 documents additional EIO, ENOLINK and EOVERFLOW error conditions.
+\fBF_GETOWN_EX\fP, \fBF_SETOWN_EX\fP, \fBF_SETPIPE_SZ\fP, \fBF_GETPIPE_SZ\fP,
+\fBF_GETSIG\fP,
+\fBF_SETSIG\fP, \fBF_NOTIFY\fP, \fBF_GETLEASE\fP, \fBF_SETLEASE\fP は Linux 固有である
+(これらの定義を有効にするには \fB_GNU_SOURCE\fP マクロを定義すること)。
+.SH 注意
+元々の 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 のラッパー関数は新しいシステムコールが
+利用できる場合はそれを利用するようになっているからである。
+
+エラーの際の返り値が \fBdup2\fP(2) と \fBF_DUPFD\fP では異なっている。
+
+カーネル 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
+システムによっては、 \fIstruct flock\fP に上記以外のフィールドがあるものもある (例えば \fIl_sysid\fP)。
+はっきりと言えることは、ロックを保持しているプロセスが別のマシンに存在 する場合には、 \fIl_pid\fP
+だけはあまり役にたたないだろうということである。
+.SH バグ
+.\" 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 システムコールの慣習
+のため以下の制限が存在する。
+\fBF_GETOWN\fP が返す (負の) プロセスグループID が \-1 から \-4095 の範囲に入った場合、
+glibc はこの返り値をシステムコールでエラーが起こったと間違って解釈してしまう。
+つまり、 \fBfcntl\fP() の返り値は \-1 となり、 \fIerrno\fP には (正の) プロセスグループID
+が設定されることになる。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 を使って、ソケットのファイルディスクリプタの所有者に 呼び出し元以外のプロセス
+(やプロセスグループ) を指定すると 発生するバグがある。この場合、 呼び出し元が所有者として指定したプロセス (やプロセスグループ) に
+シグナルを送る許可を持っていたとしても、 \fBfcntl\fP() が \-1 を返し \fIerrno\fP に \fBEPERM\fP を設定することがある。
+このエラーが返ったにもかかわらず、ファイルディスクリプタの所有者 は設定され、シグナルはその所有者に送られる。
+
+.\" http://marc.info/?l=linux-kernel&m=119013491707153&w=2
+これまでの 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)
+.P
+カーネルソースの \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.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" This manpage is Copyright (C) 2006, Michael Kerrisk
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH FSTATAT 2 2011\-09\-19 Linux "Linux Programmer's Manual"
+.SH 名前
+fstatat \- ディレクトリファイルディスクリプタから相対的な位置にあるファイルの状態を取得する
+.SH 書式
+.nf
+\fB#include <fcntl.h> /* AT_* 定数の定義 */\fP
+\fB#include <sys/stat.h>\fP
+.sp
+\fBint fstatat(int \fP\fIdirfd\fP\fB, const char *\fP\fIpathname\fP\fB, struct stat *\fP\fIbuf\fP\fB,\fP
+\fB int \fP\fIflags\fP\fB);\fP
+.fi
+.sp
+.in -4n
+glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照):
+.in
+.sp
+\fBfstatat\fP():
+.PD 0
+.ad l
+.RS 4
+.TP 4
+glibc 2.10 以降:
+_XOPEN_SOURCE\ >=\ 700 || _POSIX_C_SOURCE\ >=\ 200809L
+.TP
+glibc 2.10 より前:
+_ATFILE_SOURCE
+.RE
+.ad
+.PD
+.SH 説明
+\fBfstatat\fP() システムコールは、この man ページで説明している違いがある以外は、 \fBstat\fP(2) と全く同じように動作する。
+
+\fIpathname\fP で指定されるパス名が相対パスである場合、 ファイルディスクリプタ \fIdirfd\fP
+で参照されるディレクトリからの相対パス名として解釈される (\fBstat\fP(2)
+では、相対パスは呼び出し元プロセスのカレントワーキングディレクトリからの 相対パスとなる)。
+
+\fIpathname\fP が相対パスであり、かつ \fIdirfd\fP が特別な値 \fBAT_FDCWD\fP である場合、 \fIpathname\fP は
+(\fBstat\fP(2) と同じように) 呼び出し元プロセスの カレントワーキングディレクトリからの相対パス名として解釈される。
+
+\fIpathname\fP が絶対パスである場合、 \fIdirfd\fP は無視される。
+
+\fIflags\fP には 0 または以下のフラグの 1 つ以上を論理和 (OR) で指定する。
+.TP
+\fBAT_NO_AUTOMOUNT\fP (Linux 2.6.38 以降)
+\fIpathname\fP がオートマウントポイントのディレクトリの場合、
+\fIpathname\fP の最後の要素 ("basename") のオートマウントを行わない。
+このフラグを使うと、(マウント先の場所ではなく) オートマウントポイント
+自身の属性を収集することができる。
+ディレクトリをスキャンするようなツールで、オートマウントポイントを
+含むディレクトリで大量のオートマウントが起こらないようにするのに、
+このフラグを使うことができる。
+マウントポイントがすでにマウントされている場合には、
+\fBAT_NO_AUTOMOUNT\fP フラグは何も効果はない。
+.TP
+\fBAT_SYMLINK_NOFOLLOW\fP
+\fIpathname\fP がシンボリックリンクの場合は、それを辿るのではなく、 \fBlstat\fP(2) と同様にリンク自身についての情報を返す
+(デフォルトでは、 \fBfstatat\fP() は \fBstat\fP(2) と同様にシンボリックリンクを辿る)。
+.SH 返り値
+成功した場合、 \fBfstatat\fP() は 0 を返す。 エラーの場合、\-1 が返されて、 \fIerrno\fP にはエラーを示す値が設定される。
+.SH エラー
+\fBstat\fP(2) と同じエラーが \fBfstatat\fP() でも起こる。 \fBfstatat\fP() では、その他に以下のエラーが起こる:
+.TP
+\fBEBADF\fP
+\fIdirfd\fP が有効なファイルディスクリプタでない。
+.TP
+\fBEINVAL\fP
+\fIflags\fP に不正なフラグ値が指定された。
+.TP
+\fBENOTDIR\fP
+\fIpathname\fP が相対パスで、かつ \fIdirfd\fP がディレクトリ以外のファイルを参照するファイルディスクリプタである。
+.SH バージョン
+\fBfstatat\fP() は Linux カーネル 2.6.16 で追加された。
+.SH 準拠
+POSIX.1\-2008. Solaris には、これと同じようなシステムコールが存在する。
+.SH 注意
+\fBfstatat\fP() が必要な理由については、 \fBopenat\fP(2) を参照すること。
+
+glibc の \fBfstatat\fP() のラッパー関数が利用するシステムコールとしては、
+実際には \fBfstatat64\fP() が呼び出される。
+.SH 関連項目
+\fBopenat\fP(2), \fBstat\fP(2), \fBpath_resolution\fP(7), \fBsymlink\fP(7),
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\" Modified by Michael Haardt (michael@moria.de)
+.\" Modified 1993-07-23 by Rik Faith (faith@cs.unc.edu)
+.\" Modified 1994-08-21 by Michael Chastain (mec@shell.portal.com):
+.\" Fixed necessary '#include' lines.
+.\" Modified 1995-04-15 by Michael Chastain (mec@shell.portal.com):
+.\" Added reference to adjtimex.
+.\" Removed some nonsense lines pointed out by Urs Thuermann,
+.\" (urs@isnogud.escape.de), aeb, 950722.
+.\" Modified 1997-01-14 by Austin Donnelly (and1000@debian.org):
+.\" Added return values section, and bit on EFAULT
+.\" Added clarification on timezone, aeb, 971210.
+.\" Removed "#include <unistd.h>", aeb, 010316.
+.\" Modified, 2004-05-27 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Added notes on capability requirement.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH GETTIMEOFDAY 2 2012\-04\-26 Linux "Linux Programmer's Manual"
+.SH 名前
+gettimeofday, settimeofday \- 時刻を取得/設定する
+.SH 書式
+.nf
+\fB#include <sys/time.h>\fP
+
+\fBint gettimeofday(struct timeval *\fP\fItv\fP\fB, struct timezone *\fP\fItz\fP\fB);\fP
+
+\fBint settimeofday(const struct timeval *\fP\fItv\fP\fB, const struct timezone *\fP\fItz\fP\fB);\fP
+
+.fi
+.in -4n
+glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照):
+.in
+.sp
+\fBsettimeofday\fP(): _BSD_SOURCE
+.SH 説明
+関数 \fBgettimeofday\fP() と \fBsettimeofday\fP() は時刻とタイムゾーンを取得または設定する。 \fItv\fP 引き数は
+\fIstruct timeval\fP である (\fI<sys/time.h>\fP で定義されている):
+.sp
+.in +4n
+.nf
+struct timeval {
+ time_t tv_sec; /* 秒 */
+ suseconds_t tv_usec; /* マイクロ秒 */
+};
+.fi
+.in
+.sp
+これにより紀元 (the Epoch: \fBtime\fP(2) を参照) からの秒とマイクロ秒が取得できる。 \fItz\fP 引き数は \fIstruct
+timezone\fP である:
+.sp
+.in +4n
+.nf
+struct timezone {
+ int tz_minuteswest; /* グリニッジ標準時との差 (西方に分単位) */
+ int tz_dsttime; /* 夏時間調整の型 */
+};
+.fi
+.in
+.PP
+.\" The following is covered under EPERM below:
+.\" .PP
+.\" Only the superuser may use
+.\" .BR settimeofday ().
+\fItv\fP や \fItz\fP が NULL の場合、対応する構造体の設定/取得は行われない
+(ただし、\fItv\fP が NULL の場合には、コンパイル時の警告が発生する)。
+.PP
+\fItimezone\fP 構造体の利用は廃止予定とされている;
+通常は \fItz\fP 引き数に NULL を指定すべきである (下記の「注意」を参照)。
+
+Linux では、 \fBsettimeofday\fP() システムコールに関連して、独特の「クロックのズレ
+(warp clock)」が存在する場合がある。 これは (ブート後の) 最初の呼び出しで
+\fItz\fP 引き数が NULL でなく、 \fItv\fP 引き数が NULL で \fItz_minuteswest\fP フィールド
+が 0 でない場合に起こる (この場合 \fItz_dsttime\fP フィールドは 0 にすべきである)。
+このような場合、 \fBsettimeofday\fP() は CMOS クロックが地方時 (local time) であり、
+UTC システム時間を得るためには、\fItz_minuteswest\fP の分だけ増加させなくてはなら
+ないとみなしてしまう。 疑いもなく、この機構を使うことは良い考えではない。
+.SH 返り値
+\fBgettimeofday\fP() と \fBsettimeofday\fP() は成功すると 0 を返し、失敗した場合は \-1 を返す (この場合は
+\fIerrno\fP が適切に設定される)。
+.SH エラー
+.TP
+\fBEFAULT\fP
+\fItv\fP か \fItz\fP のどちらかがアクセス可能なアドレス空間外を指している。
+.TP
+\fBEINVAL\fP
+タイムゾーン (または他の何か) が不正である。
+.TP
+\fBEPERM\fP
+呼び出し元プロセスに \fBsettimeofday\fP() を呼び出すための十分な特権がない。 Linux では \fBCAP_SYS_TIME\fP
+ケーパビリティ (capability) が必要である。
+.SH 準拠
+SVr4, 4.3BSD に準拠する。 POSIX.1\-2001 は \fBgettimeofday\fP() については記述しているが、
+\fBsettimeofday\fP() については記述していない。 POSIX.1\-2008 では \fBgettimeofday\fP()
+は廃止予定とされており、 代わりに \fBclock_gettime\fP(2) の使用が推奨されている。
+.SH 注意
+\fBgettimeofday\fP(2) が返す時刻は、システム時間の不連続な変化
+(例えば、システム管理者がシステム時間を手動で変更した場合など)
+の影響を\fI受ける\fP。単調増加するクロックが必要な場合は、
+\fBclock_gettime\fP(2) を参照してほしい。
+
+\fItimeval\fP 構造体を操作するためのマクロの説明は \fBtimeradd\fP(3) にある。
+
+昔は \fIstruct timeval\fP のフィールドは \fIlong\fP 型であった。
+
+.\" it has not
+.\" been and will not be supported by libc or glibc.
+.\" Each and every occurrence of this field in the kernel source
+.\" (other than the declaration) is a bug.
+\fItz_dsttime\fP は Linux でこれまで使われたことはない。
+したがって、以下は純粋に歴史的な興味から書かれたものである。
+
+\fItz_dsttime\fP フィールドには (下記に示す) シンボル定数が格納される。
+これは一年のうちでいつ夏時間 (Daylight Savings Time) を実施するかを示している
+(注意: その値は年間を通した定数である: 夏時間が実施中であることを示すわけではなく、
+アルゴリズムを選択しているだけである)。 夏時間は以下のように定義される:
+.in +4n
+.nf
+
+\fBDST_NONE\fP /* 夏時間を採用していない */
+.br
+\fBDST_USA\fP /* アメリカ合衆国式夏時間 */
+.br
+\fBDST_AUST\fP /* オーストラリア式夏時間 */
+.br
+\fBDST_WET\fP /* 西ヨーロッパ式夏時間 */
+.br
+\fBDST_MET\fP /* 中央ヨーロッパ式夏時間 */
+.br
+\fBDST_EET\fP /* 東ヨーロッパ式夏時間 */
+.br
+\fBDST_CAN\fP /* カナダ */
+.br
+\fBDST_GB\fP /* グレートブリテンおよびアイルランド */
+.br
+\fBDST_RUM\fP /* ルーマニア */
+.br
+\fBDST_TUR\fP /* トルコ */
+.br
+\fBDST_AUSTALT\fP /* 1986年に移行されたオーストラリア式 */
+.fi
+.in
+.PP
+当然のことながら、夏時間がどの期間に実施されるかを国ごとの簡単なアルゴリズムで
+導くことができないことが判明した。 実際、夏時間の期間は予測不可能な政治的決定で
+決定される。そのため、この方法でタイム・ゾーンを表すことは断念された。
+Linux において \fBsettimeofday\fP() を呼び出すときは、
+\fItz_dsttime\fP フィールドを 0 にするべきである。
+.SH 関連項目
+\fBdate\fP(1), \fBadjtimex\fP(2), \fBclock_gettime\fP(2), \fBtime\fP(2),
+\fBctime\fP(3), \fBftime\fP(3), \fBtimeradd\fP(3), \fBcapabilities\fP(7),
+\fBtime\fP(7)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" This manpage is Copyright (C) 1992 Drew Eckhardt;
+.\" 1993 Michael Haardt
+.\" 1993,1994 Ian Jackson.
+.\" You may distribute it under the terms of the GNU General
+.\" Public License. It comes with NO WARRANTY.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH MKDIR 2 2010\-06\-26 Linux "Linux Programmer's Manual"
+.SH 名前
+mkdir \- ディレクトリを作成する
+.SH 書式
+.nf
+.\" .B #include <unistd.h>
+\fB#include <sys/stat.h>\fP
+\fB#include <sys/types.h>\fP
+.sp
+\fBint mkdir(const char *\fP\fIpathname\fP\fB, mode_t \fP\fImode\fP\fB);\fP
+.fi
+.SH 説明
+\fBmkdir\fP() は \fIpathname\fP で示される名前のディレクトリを作成しようとする。
+
+\fImode\fP 引き数は、作成されたディレクトリの許可属性を決定するのに使われる。 この値に、通常通りプロセスの \fIumask\fP
+による修正が加えられる。 したがって、作成されたディレクトリの許可属性は (\fImode\fP & ~\fIumask\fP & 0777) となる。
+作成されたディレクトリのその他のモードビットはオペレーティングシステムに 依存する。Linux の場合は、以下の通りである。
+
+新しく作成されたディレクトリの所有者はプロセスの実効ユーザ ID に設定される。 新たに作成されたディレクトリが含まれる親ディレクトリに set
+group ID ビットがセットされていたり、ファイルシステムが BSD の グループセマンティクス (\fImount \-o bsdgroups\fP
+あるいは、同じ意味の \fImount \-o grpid\fP) に従ってマウントされている場合には、
+新たに作成されたディレクトリのグループ所有権は親ディレクトリの ものが継承される (親ディレクトリと同じになる)。
+それ以外の場合は、グループ所有権はプロセスの実効グループ ID となる。
+
+もし親ディレクトリに set group ID ビットがセットされていれば新しく作成される ディレクトリにも set group ID
+ビットがセットされる。
+.SH 返り値
+\fBmkdir\fP() は成功した場合 0 を、失敗した場合 \-1 を返す (また、 \fIerrno\fP がエラーの内容にしたがって適切に設定される)。
+.SH エラー
+.TP
+\fBEACCES\fP
+プロセスが親ディレクトリへの書き込み許可を持たない、もしくは \fIpathname\fP 中のディレクトリのどれかに検索許可属性が無い
+(\fBpath_resolution\fP(7) も参照)。
+.TP
+\fBEEXIST\fP
+\fIpathname\fP が既に存在している(ただしそれがディレクトリであるとは限らない)。 \fIpathname\fP がシンボリックリンクの場合も
+(その指定先が存在するかどうかに関らず)エラーになる。
+.TP
+\fBEFAULT\fP
+\fIpathname\fP がアクセス可能なアドレス空間の外を指している。
+.TP
+\fBELOOP\fP
+\fIpathname\fP を解決するときに、解決すべきシンボリックリンクが多すぎた。
+.TP
+\fBEMLINK\fP
+親ディレクトリへのリンク数が \fBLINK_MAX\fP を超えてしまう。
+.TP
+\fBENAMETOOLONG\fP
+\fIpathname\fP が長すぎる。
+.TP
+\fBENOENT\fP
+\fIpathname\fP の構成要素のディレクトリのいずれかが存在しないか、 またはリンク先が存在しないシンボリックリンクである。
+.TP
+\fBENOMEM\fP
+カーネルに十分なメモリがない。
+.TP
+\fBENOSPC\fP
+\fIpathname\fP を含むデバイスに新たにディレクトリを作成する空きが無い。
+.TP
+\fBENOSPC\fP
+もしくはユーザーのディスク quota が使い切られているため、 新たにディレクトリを作成することができない。
+.TP
+\fBENOTDIR\fP
+\fIpathname\fP のディレクトリ部分が実際にはディレクトリでない。
+.TP
+\fBEPERM\fP
+\fIpathname\fP を含むファイルシステムがディレクトリの作成をサポートしていない。
+.TP
+\fBEROFS\fP
+\fIpathname\fP が読み出し専用ファイルシステム上のファイルを指している。
+.SH 準拠
+.\" SVr4 documents additional EIO, EMULTIHOP
+SVr4, BSD, POSIX.1\-2001.
+.SH 注意
+Linux では、許可ビット以外で意味を持つのは、 \fBS_ISVTX\fP モードビットだけである。 つまり、Linux
+では作成されたディレクトリは実際には (\fImode\fP & ~\fIumask\fP & 01777) のモードを持つことになる。 \fBstat\fP(2)
+を参照のこと。
+.PP
+NFS を実現しているプロトコルには多くの不備が存在し、 それら中には \fBmkdir\fP() に影響を与えるものもある。
+.SH 関連項目
+\fBmkdir\fP(1), \fBchmod\fP(2), \fBchown\fP(2), \fBmkdirat\fP(2), \fBmknod\fP(2),
+\fBmount\fP(2), \fBrmdir\fP(2), \fBstat\fP(2), \fBumask\fP(2), \fBunlink\fP(2),
+\fBpath_resolution\fP(7)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" This manpage is Copyright (C) 1992 Drew Eckhardt;
+.\" 1993 Michael Haardt, Ian Jackson.
+.\" 2008 Greg Banks
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\" Modified 1993-07-21 by Rik Faith <faith@cs.unc.edu>
+.\" Modified 1994-08-21 by Michael Haardt
+.\" Modified 1996-04-13 by Andries Brouwer <aeb@cwi.nl>
+.\" Modified 1996-05-13 by Thomas Koenig
+.\" Modified 1996-12-20 by Michael Haardt
+.\" Modified 1999-02-19 by Andries Brouwer <aeb@cwi.nl>
+.\" Modified 1998-11-28 by Joseph S. Myers <jsm28@hermes.cam.ac.uk>
+.\" Modified 1999-06-03 by Michael Haardt
+.\" Modified 2002-05-07 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Modified 2004-06-23 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" 2004-12-08, mtk, reordered flags list alphabetically
+.\" 2004-12-08, Martin Pool <mbp@sourcefrog.net> (& mtk), added O_NOATIME
+.\" 2007-09-18, mtk, Added description of O_CLOEXEC + other minor edits
+.\" 2008-01-03, mtk, with input from Trond Myklebust
+.\" <trond.myklebust@fys.uio.no> and Timo Sirainen <tss@iki.fi>
+.\" Rewrite description of O_EXCL.
+.\" 2008-01-11, Greg Banks <gnb@melbourne.sgi.com>: add more detail
+.\" on O_DIRECT.
+.\" 2008-02-26, Michael Haardt: Reorganized text for O_CREAT and mode
+.\"
+.\" FIXME . Apr 08: The next POSIX revision has O_EXEC, O_SEARCH, and
+.\" O_TTYINIT. Eventually these may need to be documented. --mtk
+.\" FIXME Linux 2.6.33 has O_DSYNC, and a hidden __O_SYNC.
+.\" FIXME: Linux 2.6.39 added O_PATH
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH OPEN 2 2012\-02\-27 Linux "Linux Programmer's Manual"
+.SH 名前
+open, creat \- ファイルやデバイスのオープン、作成を行う
+.SH 書式
+.nf
+\fB#include <sys/types.h>\fP
+\fB#include <sys/stat.h>\fP
+\fB#include <fcntl.h>\fP
+.sp
+\fBint open(const char *\fP\fIpathname\fP\fB, int \fP\fIflags\fP\fB);\fP
+\fBint open(const char *\fP\fIpathname\fP\fB, int \fP\fIflags\fP\fB, mode_t \fP\fImode\fP\fB);\fP
+
+\fBint creat(const char *\fP\fIpathname\fP\fB, mode_t \fP\fImode\fP\fB);\fP
+.fi
+.SH 説明
+ファイルの \fIpathname\fP を与えると、 \fBopen\fP() はファイルディスクリプタを返す。
+ファイルディスクリプタは、この後に続くシステムコール (\fBread\fP(2), \fBwrite\fP(2), \fBlseek\fP(2),
+\fBfcntl\fP(2) など) で使用される小さな非負の整数である。 このシステムコールが成功した場合に返されるファイルディスクリプタは
+そのプロセスがその時点でオープンしていないファイルディスクリプタの うち最小の数字のものとなる。
+.PP
+デフォルトでは、新しいファイルディスクリプタは \fBexecve\fP(2) を実行した後も
+オープンされたままとなる (つまり、 \fBfcntl\fP(2) に説明がある \fBFD_CLOEXEC\fP
+ファイルディスクリプタフラグは最初は無効である; 後述の \fBO_CLOEXEC\fP フラグ
+を使うとこのデフォルトを変更することができる)。 ファイルオフセット
+(file offset) はファイルの先頭に設定される (\fBlseek\fP(2) 参照)。
+.PP
+\fBopen\fP() を呼び出すと、「オープンファイル記述」 \fI(open file description)\fP
+が作成される。ファイル記述とは、システム全体の オープン中のファイルのテーブルのエントリである。 このエントリは、ファイルオフセットとファイル状態フラグ
+(\fBfcntl\fP(2) \fBF_SETFL\fP 操作により変更可能) が保持する。 ファイルディスクリプタはこれらのエントリの一つへの参照である。
+この後で \fIpathname\fP が削除されたり、他のファイルを参照するように変更されたりしても、 この参照は影響を受けない。
+新しいオープンファイル記述は最初は他のどのプロセスとも 共有されていないが、 \fBfork\fP(2) で共有が起こる場合がある。
+.PP
+引き数 \fIflags\fP には、アクセスモード \fBO_RDONLY\fP, \fBO_WRONLY\fP, \fBO_RDWR\fP
+のどれかひとつが入っていなければならない。 これらはそれぞれ読み込み専用、書き込み専用、読み書き用に ファイルをオープンすることを要求するものである。
+
+.\" FIXME . Actually is it true that the "file status flags" are all of the
+.\" remaining flags listed below? SUSv4 divides the flags into:
+.\" * Access mode
+.\" * File creation
+.\" * File status
+.\" * Other (O_CLOEXEC, O_DIRECTORY, O_NOFOLLOW)
+.\" though it's not clear what the difference between "other" and
+.\" "File creation" flags is. (I've raised an Aardvark to see if this
+.\" can be clarified in SUSv4; 10 Oct 2008.)
+さらに、 \fIflags\fP には、ファイル作成フラグ (file creation flag) とファイル状態フラグ (file status
+flag) を 0 個以上「ビット単位の OR (bitwise\-or)」で 指定することができる。 \fIファイル作成フラグ\fP は
+\fBO_CREAT\fP, \fBO_EXCL\fP, \fBO_NOCTTY\fP, \fBO_TRUNC\fP である。 \fIファイル状態フラグ\fP
+は以下のリストのうち上記以外の残りのものである。 二種類のフラグの違いは、ファイル状態フラグの方は \fBfcntl\fP(2)
+を使ってその内容を取得したり (場合によっては) 変更したりできる点にある。 ファイル作成フラグとファイル状態フラグの全リストを以下に示す:
+.TP
+\fBO_APPEND\fP
+.\" For more background, see
+.\" http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=453946
+.\" http://nfs.sourceforge.net/
+ファイルを追加 (append) モードでオープンする。 毎回の \fBwrite\fP(2) の前に \fBlseek\fP(2)
+を行ったかのように、ファイルポインタをファイルの最後に移動する。 NFS ファイルシステムで、 \fBO_APPEND\fP
+を使用すると、複数のプロセスがひとつのファイルに同時にデータを追加した場合、 ファイルが壊れてしまうことがある。 これは NFS
+が追加モードをサポートしていないため、 クライアントのカーネル (kernel) がそれをシミュレートしなければならないのだが、
+競合状態を避けることはできないからである。
+.TP
+\fBO_ASYNC\fP
+シグナル駆動 I/O (signal\-driven I/O) を有効にする: このファイルディスクリプタへの
+入力または出力が可能になった場合に、シグナルを生成する (デフォルトは \fBSIGIO\fP であるが、 \fBfcntl\fP(2)
+によって変更可能である)。 この機能が使用可能なのは端末、疑似端末、ソケットのみであり、 (Linux 2.6 以降では) パイプと FIFO
+に対しても使用できる。 さらに詳しい説明は \fBfcntl\fP(2) を参照すること。
+.TP
+\fBO_CLOEXEC\fP (Linux 2.6.23 以降)
+.\" This flag fixes only one form of the race condition;
+.\" The race can also occur with, for example, descriptors
+.\" returned by accept(), pipe(), etc.
+新しいファイルディスクリプタに対して close\-on\-exec フラグを有効にする。 このフラグを指定することで、プログラムは
+\fBFD_CLOEXEC\fP フラグをセットするための \fBfcntl\fP(2) \fBF_SETFD\fP 操作を別途呼び出す必要がなくなる。
+また、ある種のマルチスレッドのプログラムはこのフラグの使用は 不可欠である。なぜなら、個別に \fBFD_CLOEXEC\fP フラグを設定する
+\fBfcntl\fP(2) \fBF_SETFD\fP 操作を呼び出したとしても、あるスレッドがファイルディスクリプタを オープンするのと同時に別のスレッドが
+\fBfork\fP(2) と \fBexecve\fP(2) を実行するという競合条件を避けるのには十分ではないからである。
+.TP
+\fBO_CREAT\fP
+.\" As at 2.6.25, bsdgroups is supported by ext2, ext3, ext4, and
+.\" XFS (since 2.6.14).
+ファイルが存在しなかった場合は作成 (create) する。 ファイルの所有者 (ユーザー ID) は、プロセスの実効ユーザー ID に設定される。
+グループ所有権 (グループ ID) は、プロセスの実効グループ ID または親ディレクトリのグループ ID に設定される
+(これは、ファイルシステムタイプ、マウントオプション、 親ディレクトリのモードに依存する。 \fBmount\fP(8) で説明されているマウントオプション
+\fIbsdgroups\fP と \fIsysvgroups\fP を参照)。
+.RS
+.PP
+\fImode\fP は新しいファイルを作成する場合に使用するアクセス許可 (permission) を指定する。 \fIflags\fP に \fBO_CREAT\fP
+が指定されている場合、 \fImode\fP を指定しなければならない。 \fBO_CREAT\fP が指定されていない場合、 \fImode\fP は無視される。
+有効なアクセス許可は、普段と同じようにプロセスの \fIumask\fP によって修正され、作成されたファイルの許可は \fI(mode\ &\ ~umask)\fP となる。 このモードは、新しく作成されたファイルに対するそれ以降のアクセス にのみ適用される点に注意すること。
+読み取り専用のファイルを作成する \fBopen\fP() コールであっても、 読み書き可能なファイルディスクリプタを返すことがありうる。
+.PP
+\fImode\fP のために以下のシンボル定数が提供されている :
+.TP 9
+\fBS_IRWXU\fP
+00700 ユーザー (ファイルの所有者) に読み込み、書き込み、 実行の許可がある。
+.TP
+\fBS_IRUSR\fP
+00400 ユーザーに読み込みの許可がある。
+.TP
+\fBS_IWUSR\fP
+00200 ユーザーに書き込みの許可がある。
+.TP
+\fBS_IXUSR\fP
+00100 ユーザーに実行の許可がある。
+.TP
+\fBS_IRWXG\fP
+00070 グループに読み込み、書き込み、実行の許可がある。
+.TP
+\fBS_IRGRP\fP
+00040 グループに読み込みの許可がある。
+.TP
+\fBS_IWGRP\fP
+00020 グループに書き込みの許可がある。
+.TP
+\fBS_IXGRP\fP
+00010 グループに実行の許可がある。
+.TP
+\fBS_IRWXO\fP
+00007 他人 (others) に読み込み、書き込み、実行の許可がある。
+.TP
+\fBS_IROTH\fP
+00004 他人に読み込みの許可がある。
+.TP
+\fBS_IWOTH\fP
+00002 他人に書き込みの許可がある。
+.TP
+\fBS_IXOTH\fP
+00001 他人に実行の許可がある。
+.RE
+.TP
+\fBO_DIRECT\fP (Linux 2.4.10 以降)
+このファイルに対する I/O のキャッシュの効果を最小化しようとする。このフラグを
+使うと、一般的に性能が低下する。 しかしアプリケーションが独自にキャッシングを
+行っているような 特別な場合には役に立つ。 ファイルの I/O はユーザー空間バッファ
+に対して直接行われる。 \fBO_DIRECT\fP フラグ自身はデータを同期で転送しようとはす
+るが、 \fBO_SYNC\fP フラグのようにデータと必要なメタデータの転送が保証されるわけ
+ではない。同期 I/O を保証するためには、 \fBO_DIRECT\fP に加えて \fBO_SYNC\fP を使用
+しなければならない。下記の「注意」の節の議論も参照。
+.sp
+ブロックデバイスに対する似通った意味のインターフェースが \fBraw\fP(8) で説明されている (但し、このインタフェースは非推奨である)。
+.TP
+\fBO_DIRECTORY\fP
+.\" But see the following and its replies:
+.\" http://marc.theaimsgroup.com/?t=112748702800001&r=1&w=2
+.\" [PATCH] open: O_DIRECTORY and O_CREAT together should fail
+.\" O_DIRECTORY | O_CREAT causes O_DIRECTORY to be ignored.
+\fIpathname\fP がディレクトリでなければオープンは失敗する。 このフラグは Linux 特有であり、 \fBopendir\fP(3) が FIFO
+やテープデバイスに対してコールされた場合の サービス不能 (denial\-of\-service) 攻撃を避けるために カーネル 2.1.126
+で追加された。 しかしこれは \fBopendir\fP(3) の実装以外では使用するべきではない。
+.TP
+\fBO_EXCL\fP
+この呼び出しでファイルが作成されることを保証する。このフラグが \fBO_CREAT\fP と
+一緒に指定され、 \fIpathname\fP のファイルが既に存在した場合、 \fBopen\fP() は失敗
+する。
+
+.\" POSIX.1-2001 explicitly requires this behavior.
+これら二つのフラグが指定された際、シンボリックリンクは辿られない。 \fIpathname\fP がシンボリックリンクの場合、
+シンボリックリンクがどこを指しているかに関わらず \fBopen\fP() は失敗する。
+
+一般的には、 \fBO_CREAT\fP を指定せずに \fBO_EXCL\fP を使用した場合の
+\fBO_EXCL\fP の動作は規定されていない。
+これには一つ例外があり、Linux 2.6 以降では、
+\fIpathname\fP がブロックデバイスを参照している場合、
+\fBO_CREAT\fP なしで \fBO_EXCL\fP を使用することができる。
+システムがそのブロックデバイスを使用中の場合 (例えば、
+マウントされているなど)、 \fBopen\fP() はエラー \fBEBUSY\fP で失敗する。
+
+NFS では、 \fBO_EXCL\fP は、Linux 2.6 以降で NFSv3 以降を使っている場合でのみサポートされる。 \fBO_EXCL\fP
+サポートが提供されていない NFS 環境では、このフラグに頼って ロック処理を実行するプログラムは競合状態 (race condition) に出会う
+可能性がある。 ロックファイルを使用して不可分 (atomic) なファイルロックを実現し、 NFS が \fBO_EXCL\fP
+をサポートしているかに依存しないようにしたい場合、 移植性のある方法は、同じファイルシステム上に他と名前の重ならない ファイル (例えばホスト名と
+PID を組み合わせた名前) を作成し、 \fBlink\fP(2) を使用してそのロックファイルへのリンクを作成することである。 \fBlink\fP(2)
+コールの返り値が 0 ならばロックに成功している。 あるいは、そのファイルに \fBstat\fP(2) を使用してリンク数 (link count) が
+2 になっているかをチェックする。 そうなっていれば、同じくロックに成功しているということである。
+.TP
+\fBO_LARGEFILE\fP
+(LFS) \fIoff_t\fP ではサイズを表せない (だだし \fIoff64_t\fP ではサイズを表せる)ファ
+イルをオープン可能にする。この定義を有効にするためには、(\fIどの\fPヘッダファイ
+ルをインクルードするよりも前に) \fB_LARGEFILE64_SOURCE\fP マクロを定義しなければ
+ならない。
+32 ビットシステムにおいて大きなファイルにアクセスしたい場合、
+(\fBO_LARGEFILE\fP を使うよりも) \fB_FILE_OFFSET_BITS\fP 機能検査マクロを 64 に
+セットする方が望ましい方法である (\fBfeature_test_macros\fP(7) を参照)。
+.TP
+\fBO_NOATIME\fP (Linux 2.6.8 以降)
+.\" The O_NOATIME flag also affects the treatment of st_atime
+.\" by mmap() and readdir(2), MTK, Dec 04.
+ファイルに対して \fBread\fP(2) が実行されたときに、最終アクセス時刻 (inode の st_atime) を更新しない。
+このフラグはインデックス作成やバックアッププログラムで使うことを意図している。 これを使うとディスクに対する操作を大幅に減らすことができる。
+このフラグは全てのファイルシステムに対して有効であるわけではない。 その一例が NFS であり、サーバがアクセス時刻を管理している。
+.TP
+\fBO_NOCTTY\fP
+\fIpathname\fP が端末 (terminal) デバイス \(em \fBtty\fP(4) 参照 \(em を指している
+場合に、たとえそのプロセスが制御端末を持っていなくても、オープンしたファイル
+は制御端末にはならない。
+.TP
+\fBO_NOFOLLOW\fP
+.\" The headers from glibc 2.0.100 and later include a
+.\" definition of this flag; \fIkernels before 2.1.126 will ignore it if
+.\" used\fP.
+\fIpathname\fP がシンボリックリンクだった場合、オープンは失敗する。 これは FreeBSD の拡張で、Linux には 2.1.126
+より追加された。 pathname の前のコンポーネント (earlier component; 訳註: 最後のディレクトリセパレータより前の部分) が
+シンボリックリンクである場合には、それが指す先が参照される。
+.TP
+\fBO_NONBLOCK\fP または \fBO_NDELAY\fP
+可能ならば、ファイルは非停止 (nonblocking) モードでオープンされる。
+\fBopen\fP() も、返したファイルディスクリプタに対する以後のすべての操作も呼び出
+したプロセスを待たせることはない。 FIFO (名前付きパイプ) を扱う場合には
+\fBfifo\fP(7) も参照すること。 強制ファイルロック (mandatory file lock) やファイ
+ルリース (file lease) と組み合わせた場合の、 \fBO_NONBLOCK\fP の効果についての
+議論は、 \fBfcntl\fP(2) を参照すること。
+.TP
+\fBO_SYNC\fP
+ファイルは同期 (synchronous) I/O モードでオープンされる。 \fBopen\fP() が返したファイルディスクリプタに対して
+\fBwrite\fP(2) を行うと、必ず呼び出したプロセスをブロックし、 該当ハードウェアに物理的に書き込まれるまで返らない。
+\fI以下の「注意」の章も参照。\fP
+.TP
+\fBO_TRUNC\fP
+ファイルが既に存在し、通常ファイルであり、 書き込み可モードでオープンされている (つまり、 \fBO_RDWR\fPまたは\fBO_WRONLY\fP の)
+場合、長さ 0 に切り詰め (truncate) られる。 ファイルが FIFO または端末デバイスファイルの場合、 \fBO_TRUNC\fP
+フラグは無視される。 それ以外の場合、 \fBO_TRUNC\fP の効果は未定義である。
+.PP
+これらの選択フラグのいくつかはファイルをオープンした後でも \fBfcntl\fP(2) を使用して変更することができる。
+
+\fBcreat\fP() は \fIflags\fP に \fBO_CREAT|O_WRONLY|O_TRUNC\fP を指定して \fBopen\fP()
+を行うのと等価である。
+.SH 返り値
+\fBopen\fP() と \fBcreat\fP() は新しいファイルディスクリプタを返す。 エラーが発生した場合は \-1 を返す (その場合は
+\fIerrno\fP が適切に設定される)。
+.SH エラー
+.TP
+\fBEACCES\fP
+ファイルに対する要求されたアクセスが許されていないか、 \fIpathname\fP のディレクトリ部分の何れかのディレクトリに検索許可がなかった。
+またはファイルが存在せず、親ディレクトリへの書き込み許可がなかった。 (\fBpath_resolution\fP(7) も参照すること。)
+.TP
+\fBEEXIST\fP
+\fIpathname\fP は既に存在し、 \fBO_CREAT\fP と \fBO_EXCL\fP が使用された。
+.TP
+\fBEFAULT\fP
+\fIpathname\fP がアクセス可能なアドレス空間の外を指している。
+.TP
+\fBEFBIG\fP
+\fBEOVERFLOW\fP 参照。
+.TP
+\fBEINTR\fP
+遅いデバイス (例えば FIFO、 \fBfifo\fP(7) 参照) のオープンが完了するのを待って停止している間に
+システムコールがシグナルハンドラにより割り込まれた。 \fBsignal\fP(7) 参照。
+.TP
+\fBEISDIR\fP
+\fIpathname\fP はディレクトリを参照しており、書き込み要求が含まれていた (つまり \fBO_WRONLY\fP または \fBO_RDWR\fP
+が設定されている)。
+.TP
+\fBELOOP\fP
+\fIpathname\fP を解決する際に遭遇したシンボリックリンクが多過ぎる。 または \fBO_NOFOLLOW\fP が指定されており、
+\fIpathname\fP がシンボリックリンクだった。
+.TP
+\fBEMFILE\fP
+プロセスがオープンしているファイル数がすでに最大数に達している。
+.TP
+\fBENAMETOOLONG\fP
+\fIpathname\fP が長過ぎる。
+.TP
+\fBENFILE\fP
+オープンされているファイルの総数がシステムの制限に達している。
+.TP
+\fBENODEV\fP
+\fIpathname\fP がデバイススペシャルファイルを参照しており、対応するデバイスが存在しない。 (これは Linux
+カーネルのバグであり、この場合には \fBENXIO\fP が返されるべきである)
+.TP
+\fBENOENT\fP
+\fBO_CREAT\fP が設定されておらず、かつ指定されたファイルが存在しない。 または、 \fIpathname\fP のディレクトリ部分が存在しないか壊れた
+(dangling) シンボリックリンクである。
+.TP
+\fBENOMEM\fP
+十分なカーネルメモリーがない。
+.TP
+\fBENOSPC\fP
+\fIpathname\fP を作成する必要があるが、 \fIpathname\fP を含んでいるデバイスに新しいファイルのための空き容量がない。
+.TP
+\fBENOTDIR\fP
+\fIpathname\fP に含まれるディレクトリ部分のどれかが実際にはディレクトリでない。 または \fBO_DIRECTORY\fP が指定されており、
+\fIpathname\fP がディレクトリでない。
+.TP
+\fBENXIO\fP
+\fBO_NONBLOCK\fP | \fBO_WRONLY\fP が設定されており、指定したファイルが FIFO で
+そのファイルを読み込みのためにオープンしているプロセスが存在しない。 または、ファイルがデバイススペシャルファイルで 対応するデバイスが存在しない。
+.TP
+\fBEOVERFLOW\fP
+.\" See http://bugzilla.kernel.org/show_bug.cgi?id=7253
+.\" "Open of a large file on 32-bit fails with EFBIG, should be EOVERFLOW"
+.\" Reported 2006-10-03
+\fIpathname\fP が参照しているのが、大き過ぎてオープンできない通常のファイルである。 通常、このエラーが発生するは、32
+ビットプラットフォーム上で \fI\-D_FILE_OFFSET_BITS=64\fP を指定せずにコンパイルされたアプリケーションが、ファイルサイズが
+\fI(2<31)\-1\fP ビットを超えるファイルを開こうとした場合である。 上記の \fBO_LARGEFILE\fP も参照。 これは
+POSIX.1\-2001 で規定されているエラーである。 2.6.24 より前のカーネルでは、Linux はこの場合にエラー \fBEFBIG\fP
+を返していた。
+.TP
+\fBEPERM\fP
+.\" Strictly speaking, it's the file system UID... (MTK)
+\fBO_NOATIME\fP フラグが指定されたが、呼び出し元の実効ユーザー ID が ファイルの所有者と一致せず、かつ呼び出し元に特権
+(\fBCAP_FOWNER\fP) がない。
+.TP
+\fBEROFS\fP
+\fIpathname\fP が読み込み専用のファイルシステム上のファイルを参照しており、 書き込みアクセスが要求された。
+.TP
+\fBETXTBSY\fP
+\fIpathname\fP が現在実行中の実行イメージを参照しており、書き込みが要求された。
+.TP
+\fBEWOULDBLOCK\fP
+\fBO_NONBLOCK\fP フラグが指定されたが、そのファイルには矛盾するリースが設定されていた (\fBfcntl\fP(2) 参照)。
+.SH 準拠
+SVr4, 4.3BSD, POSIX.1\-2001. フラグ \fBO_DIRECTORY\fP, \fBO_NOATIME\fP, \fBO_NOFOLLOW\fP
+は Linux 特有のものであり、 これらのフラグの定義を得るためには、 (「どの」ヘッダファイルをインクルードするよりも前に)
+\fB_GNU_SOURCE\fP を定義する必要があるかもしれない。
+
+\fBO_CLOEXEC\fP フラグは POSIX.1\-2001 では規定されていないが、 POSIX.1\-2008 で規定されている。
+
+\fBO_DIRECT\fP は POSIX では規定されていない。 \fBO_DIRECT\fP の定義を得るには
+(「どの」ヘッダファイルをインクルードするよりも前に) \fB_GNU_SOURCE\fP を定義しなければならない。
+.SH 注意
+Linux では、 \fBO_NONBLOCK\fP フラグは、 open を実行したいが read または write を実行する意図は
+必ずしもないことを意味する。 これは \fBioctl\fP(2) のためのファイルディスクリプタを取得するために、
+デバイスをオープンするときによく用いられる。
+
+.\" See for example util-linux's disk-utils/setfdprm.c
+.\" For some background on access mode 3, see
+.\" http://thread.gmane.org/gmane.linux.kernel/653123
+.\" "[RFC] correct flags to f_mode conversion in __dentry_open"
+.\" LKML, 12 Mar 2008
+「アクセスモード」の値 \fBO_RDONLY\fP, \fBO_WRONLY\fP, \fBO_RDWR\fP は、 \fIflags\fP
+に指定できる他の値と違い、個々のビットを指定するものではなく、 これらの値は \fIflags\fP の下位 2 ビットを定義する。 \fBO_RDONLY\fP,
+\fBO_WRONLY\fP, \fBO_RDWR\fP はそれぞれ 0, 1, 2 に定義されている。 言い換えると、 \fBO_RDONLY |
+O_WRONLY\fP の組み合わせは論理的に間違いであり、確かに \fBO_RDWR\fP と同じ意味ではない。 Linux
+では、特別な、非標準なアクセスモードとして 3 (バイナリでは 11) が 予約されており \fIflags\fP に指定できる。
+このアクセスモードを指定すると、ファイルの読み出し/書き込み許可をチェックし、 読み出しにも書き込みにも使用できないディスクリプタを返す。
+この非標準のアクセスモードはいくつかの Linux ドライバで使用されており、 デバイス固有の \fBioctl\fP(2)
+操作にのみ使用されるディスクリプタを返すために使われている。
+.LP
+.\" Linux 2.0, 2.5: truncate
+.\" Solaris 5.7, 5.8: truncate
+.\" Irix 6.5: truncate
+.\" Tru64 5.1B: truncate
+.\" HP-UX 11.22: truncate
+.\" FreeBSD 4.7: truncate
+\fBO_RDONLY | O_TRUNC\fP の影響は未定義であり、その動作は実装によって異なる。 多くのシステムではファイルは実際に切り詰められる。
+.PP
+NFS を実現しているプロトコルには多くの不備があり、特に \fBO_SYNC\fP と \fBO_NDELAY\fP に影響する。
+
+POSIX では、3 種類の同期 I/O が提供されており、 \fBO_SYNC\fP, \fBO_DSYNC\fP, \fBO_RSYNC\fP
+フラグがこれに対応するものである。 今のところ (カーネル 2.6.31)、 Linux では \fBO_SYNC\fP だけが実装されているが、 glibc
+は \fBO_DSYNC\fP と \fBO_RSYNC\fP に \fBO_SYNC\fP と同じ数値を割り当てている。 ほとんどの Linux
+のファイルシステムは、実際には POSIX の \fBO_SYNC\fP の動作ではなく \fBO_DSYNC\fP の動作だけを実装している。 POSIX の
+\fBO_SYNC\fP では、 \fBopen\fP() がユーザ空間に返る際に、書き込みに関する全てのメタデータの
+更新がディスクに書き込まれている必要がある。 一方、 \fBO_DSYNC\fP では、 \fBopen\fP()
+が返るまでに、実際のファイルのデータとそのデータを取得するために 必要なメタデータだけがディスクに書き込まれていればよい。
+
+\fBopen\fP() はスペシャルファイルをオープンすることができるが、 \fBcreat\fP() でスペシャルファイルを作成できない点に注意すること。
+代わりに \fBmknod\fP(2) を使用する。
+.LP
+UID マッピングを使用している NFS ファイルシステムでは、 \fBopen\fP() がファイルディスクリプタを返した場合でも \fBread\fP(2)
+が \fBEACCES\fP で拒否される場合がある。 これはクライアントがアクセス許可のチェックを行って \fBopen\fP()
+を実行するが、読み込みや書き込みの際には サーバーで UID マッピングが行われるためである。
+
+ファイルが新しく作成されると、 ファイルの \fIst_atime\fP, \fIst_ctime\fP, \fIst_mtime\fP フィールド
+(それぞれ最終アクセス時刻、最終状態変更時刻、最終修正時刻である。 \fBstat\fP(2) 参照) が現在時刻に設定される。 さらに親ディレクトリの
+\fIst_ctime\fP と \fIst_mtime\fP も現在時刻に設定される。 それ以外の場合で、O_TRUNC フラグでファイルが修正されたときは、
+ファイルの \fIst_ctime\fP と \fIst_mtime\fP フィールドが現在時刻に設定される。
+.SS O_DIRECT
+.LP
+\fBO_DIRECT\fP フラグを使用する場合、ユーザ空間バッファの長さやアドレス、 I/O
+のファイルオフセットに関してアラインメントの制限が課されることがある。 Linux では、アラインメントの制限はファイルシステムやカーネルのバージョンに
+よって異なり、全く制限が存在しない場合もある。 しかしながら、現在のところ、指定されたファイルやファイルシステムに対して
+こうした制限があるかを見つけるための、アプリケーション向けのインタフェースで ファイルシステム非依存のものは存在しない。
+いくつかのファイルシステムでは、制限を確認するための独自のインタフェースが 提供されている。例えば、 \fBxfsctl\fP(3) の
+\fBXFS_IOC_DIOINFO\fP 命令である。
+.LP
+Linux 2.4 では、転送サイズ、 ユーザーバッファのアラインメント、ファイルオフセットは、
+ファイルシステムの論理ブロックサイズの倍数でなければならない。 Linux 2.6 では、512 バイトごとの境界に配置されていれば充分である。
+.LP
+\fBO_DIRECT\fP フラグは SGI IRIX で導入された。SGI IRIX にも Linux 2.4 と同様の (ユーザーバッファの)
+アラインメントの制限がある。 また、IRIX には適切な配置とサイズを取得するための \fBfcntl\fP(2) コールがある。 FreeBSD 4.x
+も同じ名前のフラグを導入したが、アラインメントの制限はない。
+.LP
+\fBO_DIRECT\fP が Linux でサポートされたのは、カーネルバージョン 2.4.10 である。 古い Linux
+カーネルは、このフラグを単に無視する。 \fBO_DIRECT\fP フラグをサポートしていないファイルシステムもあり、その場合は、 \fBO_DIRECT\fP
+を使用すると \fBopen\fP() は \fBEINVAL\fP で失敗する。
+.LP
+アプリケーションは、同じファイル、 特に同じファイルの重複するバイト領域に対して、 \fBO_DIRECT\fP と通常の I/O
+を混ぜて使うのは避けるべきである。 ファイルシステムがこのような状況において一貫性の問題を正しく 扱うことができる場合であっても、全体の I/O
+スループットは どちらか一方を使用するときと比べて低速になるであろう。 同様に、アプリケーションは、同じファイルに対して \fBmmap\fP(2) と直接
+I/O (\fBO_DIRECT\fP) を混ぜて使うのも避けるべきである。
+.LP
+NFS で \fBO_DIRECT\fP を使った場合の動作はローカルのファイルシステムの場合と違う。
+古いカーネルや、ある種の設定でコンパイルされたカーネルは、 \fBO_DIRECT\fP と NFS の組み合わせをサポートしていないかもしれない。 NFS
+プロトコル自体はサーバにフラグを渡す機能は持っていないので、 \fBO_DIRECT\fP I/O
+はクライアント上のページキャッシュをバイパスするだけになり、 サーバは I/O をキャッシュしているかもしれない。 クライアントは、
+\fBO_DIRECT\fP の同期機構を保持するため、サーバに対して I/O を同期して行うように依頼する。 サーバによっては、こうした状況下、特に I/O
+サイズが小さい場合に 性能が大きく劣化する。 また、サーバによっては、I/O が安定したストレージにまで行われたと、
+クライアントに対して嘘をつくものもある。 これは、サーバの電源故障が起こった際にデータの完全性が保たれない
+危険は少しあるが、性能面での不利な条件を回避するために行われている。 Linux の NFS クライアントでは \fBO_DIRECT\fP I/O
+でのアラインメントの制限はない。
+.PP
+まとめると、 \fBO_DIRECT\fP は、注意して使うべきであるが、強力なツールとなる可能性を持っている。 アプリケーションは \fBO_DIRECT\fP
+をデフォルトでは無効になっている性能向上のためのオプションと 考えておくのがよいであろう。
+.PP
+.RS
+「O_DIRECT でいつも困るのは、インタフェース全部が本当にお馬鹿な点だ。 たぶん危ないマインドコントロール剤で
+頭がおかしくなったサルが設計したんじゃないかな」 \(em Linus
+.RE
+.SH バグ
+.\" FIXME . Check bugzilla report on open(O_ASYNC)
+.\" See http://bugzilla.kernel.org/show_bug.cgi?id=5993
+現在のところ、 \fBopen\fP() の呼び出し時に \fBO_ASYNC\fP を指定してシグナル駆動 I/O を有効にすることはできない。
+このフラグを有効にするには \fBfcntl\fP(2) を使用すること。
+.SH 関連項目
+\fBchmod\fP(2), \fBchown\fP(2), \fBclose\fP(2), \fBdup\fP(2), \fBfcntl\fP(2), \fBlink\fP(2),
+\fBlseek\fP(2), \fBmknod\fP(2), \fBmmap\fP(2), \fBmount\fP(2), \fBopenat\fP(2), \fBread\fP(2),
+\fBsocket\fP(2), \fBstat\fP(2), \fBumask\fP(2), \fBunlink\fP(2), \fBwrite\fP(2),
+\fBfopen\fP(3), \fBfifo\fP(7), \fBpath_resolution\fP(7), \fBsymlink\fP(7)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Copyright (c) 1983, 1991 The Regents of the University of California.
+.\" And Copyright (C) 2011 Guillem Jover <guillem@hadrons.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)readlink.2 6.8 (Berkeley) 3/10/91
+.\"
+.\" Modified Sat Jul 24 00:10:21 1993 by Rik Faith (faith@cs.unc.edu)
+.\" Modified Tue Jul 9 23:55:17 1996 by aeb
+.\" Modified Fri Jan 24 00:26:00 1997 by aeb
+.\" 2011-09-20, Guillem Jover <guillem@hadrons.org>:
+.\" Added text on dynamically allocating buffer + example program
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH READLINK 2 2011\-09\-20 Linux "Linux Programmer's Manual"
+.SH 名前
+readlink \- シンボリックリンクの値を読む
+.SH 書式
+\fB#include <unistd.h>\fP
+.sp
+\fBssize_t readlink(const char *\fP\fIpath\fP\fB, char *\fP\fIbuf\fP\fB, size_t
+\fP\fIbufsiz\fP\fB);\fP
+.sp
+.in -4n
+glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照):
+.in
+.sp
+.ad l
+\fBreadlink\fP():
+.RS 4
+_BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500 || _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED || _POSIX_C_SOURCE\ >=\ 200112L
+.RE
+.ad b
+.SH 説明
+\fBreadlink\fP() は \fIpath\fP で与えられたシンボリックリンクの内容を \fIbuf\fP バッファーへ格納する、 \fIbuf\fP のサイズは
+\fIbufsiz\fP である。 \fBreadlink\fP() は NULL バイトを \fIbuf\fP に追加しない。
+その内容全てを格納するのにバッファーが小さ過ぎる場合は、 (\fIbufsiz\fP バイトの長さに) 内容を切り詰める。
+.SH 返り値
+成功すると、 \fBreadlink\fP() は \fIbuf\fP に格納されたバイト数を返す。 エラーの場合、\-1 を返し、 \fIerrno\fP
+にエラーを示す値を設定する。
+.SH エラー
+.TP
+\fBEACCES\fP
+パスのディレクトリ部分に検索許可が与えられていない (\fBpath_resolution\fP(7) も参照すること)。
+.TP
+\fBEFAULT\fP
+\fIbuf\fP がプロセスに割り当てられたアドレス空間の外を指している。
+.TP
+\fBEINVAL\fP
+.\" At the glibc level, bufsiz is unsigned, so this error can only occur
+.\" if bufsiz==0. However, the in the kernel syscall, bufsiz is signed,
+.\" and this error can also occur if bufsiz < 0.
+.\" See: http://thread.gmane.org/gmane.linux.man/380
+.\" Subject: [patch 0/3] [RFC] kernel/glibc mismatch of "readlink" syscall?
+\fIbufsiz\fP が正でない。
+.TP
+\fBEINVAL\fP
+指定したファイルがシンボリックリンクでない。
+.TP
+\fBEIO\fP
+ファイルシステムの読み込み中に I/O エラーが起こった。
+.TP
+\fBELOOP\fP
+パス名にシンボリックリンクが多すぎる。
+.TP
+\fBENAMETOOLONG\fP
+パス名かパス名の一部分が長過ぎる。
+.TP
+\fBENOENT\fP
+その名前のファイルが存在しない。
+.TP
+\fBENOMEM\fP
+十分なカーネルメモリーがない。
+.TP
+\fBENOTDIR\fP
+パスのディレクトリ部分がディレクトリでない。
+.SH 準拠
+4.4BSD (\fBreadlink\fP() は 4.2BSD で初めて登場した), POSIX.1\-2001.
+.SH 注意
+バージョン 2.4 以前の glibc (バージョン 2.4 を含む) では、 \fBreadlink\fP() の返り値の型は \fIint\fP
+で宣言されていた。現在では、返り値の型は \fIssize_t\fP である (返り値 \fIssize_t\fP は POSIX.1\-2001 で (新たに)
+必須となった)。
+
+静的な大きさのバッファを使うと、シンボリックリンクの内容を
+格納するのに十分な領域がない場合がある。
+バッファに必要なサイズは、そのシンボリックリンクに対して \fBlstat\fP(2)
+の呼び出しで返される \fIstat.st_size\fP の値から取得できる。
+ただし、 \fBreadlink\fP() が書き込んだバイト数をチェックして、
+シンボリックリンクのサイズが \fBlstat\fP(2) と \fBreadlink\fP() の呼び出し
+の間で増えていないことを確認すべきである。
+\fBreadlink\fP() 用のバッファを動的に割り当てる方法でも、
+バッファサイズとして \fIPATH_MAX\fP を使用する場合に共通する移植性の
+問題を解決することができる。なぜなら、POSIX では、
+システムがそのような上限値を定義していない場合には、
+\fIPATH_MAX\fP が定義されることが保証されていないからである。
+.SH 例
+以下のプログラムは、 \fBreadlink\fP() が必要とするバッファを、
+\fBlstat\fP() が提供する情報に基づいて動的に割り当てる。
+また、両方の呼び出し間で競合条件がないことを保証している。
+.nf
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int
+main(int argc, char *argv[])
+{
+ struct stat sb;
+ char *linkname;
+ ssize_t r;
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s <pathname>\en", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ if (lstat(argv[1], &sb) == \-1) {
+ perror("lstat");
+ exit(EXIT_FAILURE);
+ }
+
+ linkname = malloc(sb.st_size + 1);
+ if (linkname == NULL) {
+ fprintf(stderr, "insufficient memory\en");
+ exit(EXIT_FAILURE);
+ }
+
+ r = readlink(argv[1], linkname, sb.st_size + 1);
+
+ if (r < 0) {
+ perror("lstat");
+ exit(EXIT_FAILURE);
+ }
+
+ if (r > sb.st_size) {
+ fprintf(stderr, "symlink increased in size "
+ "between lstat() and readlink()\en");
+ exit(EXIT_FAILURE);
+ }
+
+ linkname[sb.st_size] = \(aq\e0\(aq;
+
+ printf("\(aq%s\(aq points to \(aq%s\(aq\en", argv[1], linkname);
+
+ exit(EXIT_SUCCESS);
+}
+.fi
+.SH 関連項目
+\fBreadlink\fP(1), \fBlstat\fP(2), \fBreadlinkat\fP(2), \fBstat\fP(2), \fBsymlink\fP(2),
+\fBpath_resolution\fP(7), \fBsymlink\fP(7)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Copyright (C) 2007, 2010 Michael Kerrisk <mtk.manpages@gmail.com>
+.\" and Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de)
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\" License.
+.\" Modified Sat Jul 24 18:34:44 1993 by Rik Faith (faith@cs.unc.edu)
+.\" Merged readv.[23], 2002-10-17, aeb
+.\" 2007-04-30 mtk, A fairly major rewrite to fix errors and
+.\" add more details.
+.\" 2010-11-16, mtk, Added documentation of preadv() and pwritev()
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH READV 2 2010\-11\-17 Linux "Linux Programmer's Manual"
+.SH 名前
+readv, writev, preadv, pwritev \- 複数のバッファへの読み書きを行なう
+.SH 書式
+.nf
+\fB#include <sys/uio.h>\fP
+.sp
+\fBssize_t readv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP
+.sp
+\fBssize_t writev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP
+.sp
+\fBssize_t preadv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP
+\fB off_t \fP\fIoffset\fP\fB);\fP
+.sp
+\fBssize_t pwritev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP
+\fB off_t \fP\fIoffset\fP\fB);\fP
+.fi
+.sp
+.in -4n
+glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照):
+.in
+.sp
+\fBpreadv\fP(), \fBpwritev\fP(): _BSD_SOURCE
+.SH 説明
+\fBreadv\fP() システムコールは、ファイルディスクリプタ \fIfd\fP に関連付けられた
+ファイルから、 \fIiovcnt\fP 個のバッファ分のデータを読み込み、 \fIiov\fP で指定
+されたバッファに格納する ("scatter input";「ばらまき入力」)。
+.PP
+\fBwritev\fP() システムコールは、 \fIiov\fP で指定されたバッファから最大 \fIiovcnt\fP
+個のバッファ分のデータを取り出し、 ファイルディスクリプタ \fIfd\fP に関連付けら
+れたファイルに書き込む ("gather output";「かき集め出力」)。
+.PP
+ポインタ \fIiov\fP は \fIiovec\fP 構造体の配列へのポインタである。 \fIiovec\fP 構造体は \fI<sys/uio.h>\fP
+で以下のように定義されている:
+.PP
+.br
+.in +4n
+.nf
+struct iovec {
+ void *iov_base; /* Starting address */
+ size_t iov_len; /* Number of bytes to transfer */
+};
+.fi
+.in
+.PP
+\fBreadv\fP() システムコールは、複数のバッファにデータを読み込む点を除いて
+\fBread\fP(2) と全く同様の動作を行う。
+.PP
+\fBwritev\fP() システムコールは、複数のバッファのデータを書き出す点以外は
+\fBwrite\fP(2) と全く同様の動作を行う。
+.PP
+バッファは配列の順序で処理される。これは、 \fBreadv\fP() が \fIiov\fP[0] が完全に一杯になるまでデータを詰めてから、
+\fIiov\fP[1] などに進むことを意味する (データが十分ない場合は、 \fIiov\fP が指すバッファのいずれも一杯にならない)。 同様に、
+\fBwritev\fP() は \fIiov\fP[0] の内容を全部書き出してから \fIiov\fP[1] などに進む。
+.PP
+\fBreadv\fP() と \fBwritev\fP() によるデータ転送は atomic に行われる。つまり、 \fBwritev\fP()
+によるデータ書き込みは一つのブロックとして行われ、他のプロセスの write による書き込みと混ざり合うことはない (例外に関しては
+\fBpipe\fP(7) を参照のこと)。同様に、 \fBreadv\fP() はファイルから連続するデータブロックが読み出すことが保証され、
+同じファイル記述 (file description; \fBopen\fP(2) 参照) を参照するファイルディスクリプタを持つ他のスレッドやプロセスが
+実行した read 操作の影響を受けることはない。
+.SS "preadv() と pwritev()"
+\fBpreadv\fP() システムコールは \fBreadv\fP() と \fBpreadv\fP(2) の機能を
+組み合わせたものである。
+\fBreadv\fP() と同じ処理を実行するが、
+4 番目の引き数 \fIoffset\fP が追加されており、
+この引き数は入力操作を行うファイルオフセットを指定する。
+
+\fBpwritev\fP() システムコールは \fBwritev\fP() と \fBpwrite\fP(2) の機能を
+組み合わせたものである。
+\fBwritev\fP() と同じ処理を実行するが、
+4 番目の引き数 \fIoffset\fP が追加されており、
+この引き数は出力操作を行うファイルオフセットを指定する。
+
+これらのシステムコールで、ファイルオフセットは変更されない。
+\fIfd\fP が参照するファイルは seek 可能でなければならない。
+.SH 返り値
+成功した場合、 \fBreadv\fP() と \fBpreadv\fP は読み込んだバイト数を返し、
+\fBwritev\fP() と \fBpwritev\fP()は書き込んだバイト数を返す。
+エラーの場合 \-1 を返し、\fIerrno\fP を適切に設定する。
+.SH エラー
+\fBread\fP(2) や \fBwrite\fP(2) と同じエラーが定義されている。
+さらに、 \fBpreadv\fP() と \fBpwritev\fP() は \fBlseek\fP(2) と同じ理由でも失敗する。
+また、追加で以下のエラーが定義されている:
+.TP
+\fBEINVAL\fP
+\fIiov_len\fP の合計が \fIssize_t\fP の範囲をオーバーフローした。もしくは、 ベクタ数 \fIiovcnt\fP が 0
+より小さいか許可された最大値よりも大きかった。
+.SH バージョン
+\fBpreadv\fP() と \fBpwritev\fP() は Linux 2.6.30 で初めて登場した。
+ライブラリによるサポートは glibc 2.10 で追加された。
+.SH 準拠
+.\" The readv/writev system calls were buggy before Linux 1.3.40.
+.\" (Says release.libc.)
+\fBreadv\fP(), \fBwritev\fP():
+4.4BSD (これらのシステムコールは 4.2BSD で最初に現われた)、POSIX.1\-2001。
+Linux libc5 では、 \fIiovcnt\fP 引き数の型として \fIsize_t\fP を、
+返り値の型として \fIint\fP を使用していた。
+
+\fBpreadv\fP(), \fBpwritev\fP(): 非標準だが、最近の BSD にも存在する。
+.SH 注意
+.SS "Linux での注意"
+POSIX.1\-2001 では、 \fIiov\fP で渡すことができる要素数に上限を設ける実装が認められている。 実装は、
+\fI<limits.h>\fP の \fBIOV_MAX\fP を定義することや、実行時に \fIsysconf(_SC_IOV_MAX)\fP
+の返り値経由で、この上限を広告することができる。 Linux では、この仕組みにより広告される上限は 1024 であり、
+この値はカーネルでの上限そのものである。 一方で、glibc のラッパー関数は、その関数の内部で呼ばれるカーネル
+システムコールがこの上限を超過して失敗したことを検出すると、 追加の動作をする。 \fBreadv\fP() の場合、ラッパー関数は \fIiov\fP
+で指定された全ての要素を格納できる大きさの一時バッファを割り当て、 \fBread\fP(2) を呼び出す際にそのバッファを渡し、 そのバッファのデータを
+\fIiov\fP の各要素の \fIiov_base\fP フィールドが指定する場所にコピーしてから、 そのバッファを解放する。 \fBwritev\fP()
+のラッパー関数も、同じように一時バッファを使って \fBwrite\fP(2) を呼び出す。
+.SH バグ
+ファイルディスクリプタに対する操作を行う \fBreadv\fP() や \fBwritev\fP() と、
+標準入出力ライブラリの関数をごちゃまぜにして呼ぶのはお薦めしない。
+どんな結果になるかは定義されておらず、おそらく期待する結果は
+得られないだろう。
+.SH 例
+以下のサンプルコードは \fBwritev\fP() の使用方法を示すものである。
+
+.in +4n
+.nf
+char *str0 = "hello ";
+char *str1 = "world\en";
+struct iovec iov[2];
+ssize_t nwritten;
+
+iov[0].iov_base = str0;
+iov[0].iov_len = strlen(str0);
+iov[1].iov_base = str1;
+iov[1].iov_len = strlen(str1);
+
+nwritten = writev(STDOUT_FILENO, iov, 2);
+.fi
+.in
+.SH 関連項目
+\fBpread\fP(2), \fBread\fP(2), \fBwrite\fP(2)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" Copyright (C) Tom Bjorkholm & Markus Kuhn, 1996
+.\"
+.\" This is free documentation; you can redistribute it and/or
+.\" modify it under the terms of the GNU General Public License as
+.\" published by the Free Software Foundation; either version 2 of
+.\" the License, or (at your option) any later version.
+.\"
+.\" The GNU General Public License's references to "object code"
+.\" and "executables" are to be interpreted as the output of any
+.\" document formatting or typesetting system, including
+.\" intermediate and printed output.
+.\"
+.\" This manual is distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+.\" GNU General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public
+.\" License along with this manual; if not, write to the Free
+.\" Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111,
+.\" USA.
+.\"
+.\" 1996-04-01 Tom Bjorkholm <tomb@mydata.se>
+.\" First version written
+.\" 1996-04-10 Markus Kuhn <mskuhn@cip.informatik.uni-erlangen.de>
+.\" revision
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH SCHED_RR_GET_INTERVAL 2 2011\-10\-16 Linux "Linux Programmer's Manual"
+.SH 名前
+sched_rr_get_interval \- 指定されたプロセスの SCHED_RR 間隔を取得する
+.SH 書式
+\fB#include <sched.h>\fP
+.sp
+\fBint sched_rr_get_interval(pid_t \fP\fIpid\fP\fB, struct timespec *\fP\fItp\fP\fB);\fP
+.SH 説明
+\fBsched_rr_get_interval\fP() は \fItp\fP で指定された \fItimespec\fP 構造体に
+\fIpid\fP で指定されたプロセスのラウンドロビン時間量 (round robin time
+quantum) を書き込む。指定されたプロセスは \fBSCHED_RR\fP スケジューリング
+ポリシーで動作しているはずである。
+
+\fItimespec\fP 構造体は以下の通りである:
+
+.in +4n
+.nf
+struct timespec {
+ time_t tv_sec; /* seconds */
+ long tv_nsec; /* nanoseconds */
+};
+.fi
+.in
+
+.\" FIXME . On Linux, sched_rr_get_interval()
+.\" returns the timeslice for SCHED_OTHER processes -- this timeslice
+.\" is influenced by the nice value.
+.\" For SCHED_FIFO processes, this always returns 0.
+.\"
+.\" The round-robin time quantum value is not alterable under Linux
+.\" 1.3.81.
+.\"
+\fIpid\fP が 0 の場合、呼び出したプロセスの時間量 (time quantum) が
+\fI*tp\fP に書き込まれる。
+.SH 返り値
+成功した場合は \fBsched_rr_get_interval\fP() は 0 を返す。 エラーの場合は \-1 が返され、 \fIerrno\fP
+が適切に設定される。
+.SH エラー
+.TP
+\fBEFAULT\fP
+情報をユーザ空間にコピーする時に問題が起きた。
+.TP
+\fBEINVAL\fP
+PID が不正である。
+.TP
+\fBENOSYS\fP
+システム・コールがまだ実装されていない (かなり古いカーネルにおいてのみ)。
+.TP
+\fBESRCH\fP
+プロセス ID が \fIpid\fP のプロセスが見つからなかった。
+.SH 準拠
+POSIX.1\-2001.
+.SH 注意
+POSIX システムで \fBsched_rr_get_interval\fP() は \fI<unistd.h>\fP に
+\fB_POSIX_PRIORITY_SCHEDULING\fP が定義されている場合にのみ使用可能である。
+.SS "Linux での注意"
+.\" commit a4ec24b48ddef1e93f7578be53270f0b95ad666c
+.\" .SH BUGS
+.\" As of Linux 1.3.81
+.\" .BR sched_rr_get_interval ()
+.\" returns with error
+.\" ENOSYS, because SCHED_RR has not yet been fully implemented and tested
+.\" properly.
+POSIX ではラウンドロビン時間量の大きさを制御する仕組みが規定されていな
+い。古い Linux カーネルではこれを変更する方法が提供されている (この方法
+に移植性はない)。プロセスの nice 値を調整することで時間量を制御できる
+(\fBsetpriority\fP(2) 参照)。 負の nice 値 (すなわち、高い nice 値) を割り
+当てると時間量は長くなり、 正の nice 値 (すなわち、低い nice 値) を割り
+当てると時間量は短くなる。 デフォルトの時間量は 0.1 秒である。 nice 値
+の変更が時間量にどの程度影響を与えるかは カーネルのバージョンにより多少
+異なる。
+.SH 関連項目
+\fBsched_setscheduler\fP(2) に Linux のスケジューリング方式についての説明
+がある。
+.PP
+\fIProgramming for the real world \- POSIX.4\fP by Bill O. Gallmeister, O'Reilly
+& Associates, Inc., ISBN 1\-56592\-074\-0
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
機構が使用されている場合には、プロセスが動作する CPU 集合 に対してシステムはさらに制限を加えるかもしれない ("cpuset" 機構については
\fBcpuset\fP(7) を参照)。 プロセスが動作する実際の CPU 集合に対する制限はカーネルにより 暗黙のうちに適用される。
-\fBsched_setscheduler\fP(2) に Linux のスケジューリング方式についての説明がある。
+\fBsched_setscheduler\fP(2) に Linux のスケジューリング方式についての説明
+がある。
.PP
実際には affinity マスクはスレッド単位の属性で、スレッドグループの 各スレッド単位に独立して調整することができる。 \fBgettid\fP(2)
コールからの返り値をこのコールの \fIpid\fP 引き数として渡すことができる。 \fIpid\fP に 0 を指定すると呼び出し元のスレッドの属性が設定され、
--- /dev/null
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" This manpage is Copyright (C) 1992 Drew Eckhardt;
+.\" 1993 Ian Jackson.
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\" Modified 1993-07-24 by Rik Faith <faith@cs.unc.edu>
+.\" Modified 1996-09-08 by Arnt Gulbrandsen <agulbra@troll.no>
+.\" Modified 1997-01-31 by Eric S. Raymond <esr@thyrsus.com>
+.\" Modified 2001-05-17 by aeb
+.\" Modified 2004-06-23 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH UNLINK 2 2011\-09\-15 Linux "Linux Programmer's Manual"
+.SH 名前
+unlink \- 名前を削除し、場合によってはそれが参照しているファイルも削除する
+.SH 書式
+\fB#include <unistd.h>\fP
+.sp
+\fBint unlink(const char *\fP\fIpathname\fP\fB);\fP
+.SH 説明
+\fBunlink\fP() はファイルシステム上の名前を削除する。 もしその名前がファイルへの最後のリンク (link) であり、
+どのプロセスもそのファイルをオープン (open) していなければ、 ファイルは削除される。
+ファイルが使用していたディスク上の領域は再利用が可能になる。
+
+もし削除する名前がファイルへの最後のリンクだが、どれかのプロセスが そのファイルをまだオープンしている場合は、
+そのファイルを参照している最後のファイルディスクリプタ (file descriptor) がクローズ (close)
+されるまでファイルは存在し続ける。
+
+もしその名前がシンボリックリンク (symbolic link) を参照していれば、 リンクは削除される。
+
+もし名前がソケット (socket) や fifo やデバイス (device) を参照していれば
+名前は削除されるがそのオブジェクトをオープンしていたプロセスは それを使い続けることができる。
+.SH 返り値
+成功した場合は 0 が返される。エラーの場合は \-1 が返され、 \fIerrno\fP が適切に設定される。
+.SH エラー
+.TP
+\fBEACCES\fP
+\fIpathname\fP を含んでいるディレクトリの書き込み許可がプロセスの実効 (effective) ユーザー ID に与えられていないか、
+\fIpathname\fP の中のディレクトリのどれかに検索許可が与えられていない (\fBpath_resolution\fP(7) も参照すること)。
+.TP
+\fBEBUSY\fP
+システムか別のプロセスがそのファイルを使用中のため、
+ファイル \fIpathname\fP を unlink できない。
+例えば、そのファイルがマウントポイントの場合や、
+NFS クライアントソフトウェアがそのファイルがアクティブであるが
+名前なし inode (nameless inode) であることを示すために作成した
+場合 ("NFS silly renamed") などがある。
+.TP
+\fBEFAULT\fP
+\fIpathname\fP がアクセス可能なアドレス空間の外を指している。
+.TP
+\fBEIO\fP
+I/O エラーが発生した。
+.TP
+\fBEISDIR\fP
+\fIpathname\fP がディレクトリを参照している。 (これは POSIX で規定されていない値で、Linux 2.1.132 以降で返される。)
+.TP
+\fBELOOP\fP
+\fIpathname\fP を解決する際に遭遇したシンボリックリンクが多過ぎる。
+.TP
+\fBENAMETOOLONG\fP
+\fIpathname\fP が長過ぎる。
+.TP
+\fBENOENT\fP
+\fIpathname\fP に対応するものが存在しないか、壊れたシンボリックリンクであるか、 \fIpathname\fP が空である。
+.TP
+\fBENOMEM\fP
+十分なカーネルメモリーがない。
+.TP
+\fBENOTDIR\fP
+\fIpathname\fP のディレクトリ部分が、実際には、ディレクトリでない。
+.TP
+\fBEPERM\fP
+システムがディレクトリに対する unlink 操作を許可していない。 またはディレクトリに対する unlink 操作のために必要な特権を
+呼び出し元のプロセスが持っていない。 (これは POSIX で規定されているエラーの返し方である。 上述の通り、この場合には Linux は
+\fBEISDIR\fP を返す。)
+.TP
+\fBEPERM\fP (Linux のみ)
+ファイルシステムがファイルに対する unlink 操作を許していない。
+.TP
+\fBEPERM\fP または \fBEACCES\fP
+\fIpathname\fP を含んでいるディレクトリにスティッキービット (sticky\-bit) (\fBS_ISVTX\fP)
+が設定されていて、プロセスの実効ユーザー ID が削除しようとするファイルの UID でもそれを含んでいるディレクトリのものでもなく、
+かつプロセスに特権がない (Linux では \fBCAP_FOWNER\fP ケーパビリティ (capability) がない)。
+.TP
+\fBEROFS\fP
+\fIpathname\fP が読み込み専用のファイルシステムのファイルを参照している。
+.SH 準拠
+.\" SVr4 documents additional error
+.\" conditions EINTR, EMULTIHOP, ETXTBSY, ENOLINK.
+SVr4, 4.3BSD, POSIX.1\-2001.
+.SH バグ
+NFS プロトコルに内在する問題により、まだ使用中のファイルが想定外に消えてしまうことがありえる。
+.SH 関連項目
+\fBrm\fP(1), \fBchmod\fP(2), \fBlink\fP(2), \fBmknod\fP(2), \fBopen\fP(2), \fBrename\fP(2),
+\fBrmdir\fP(2), \fBunlinkat\fP(2), \fBmkfifo\fP(3), \fBremove\fP(3),
+\fBpath_resolution\fP(7), \fBsymlink\fP(7)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Copyright (C) 2006, Janak Desai <janak@us.ibm.com>
+.\" and Copyright (C) 2006, Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Licensed under the GPL
+.\"
+.\" Patch Justification:
+.\" unshare system call is needed to implement, using PAM,
+.\" per-security_context and/or per-user namespace to provide
+.\" polyinstantiated directories. Using unshare and bind mounts, a
+.\" PAM module can create private namespace with appropriate
+.\" directories(based on user's security context) bind mounted on
+.\" public directories such as /tmp, thus providing an instance of
+.\" /tmp that is based on user's security context. Without the
+.\" unshare system call, namespace separation can only be achieved
+.\" by clone, which would require porting and maintaining all commands
+.\" such as login, and su, that establish a user session.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH UNSHARE 2 2010\-10\-30 Linux "Linux Programmer's Manual"
+.SH 名前
+unshare \- プロセス実行コンテキストの一部を分離する
+.SH 書式
+.nf
+.\" Actually _BSD_SOURCE || _SVID_SOURCE
+.\" FIXME See http://sources.redhat.com/bugzilla/show_bug.cgi?id=4749
+\fB#define _GNU_SOURCE\fP /* feature_test_macros(7) 参照 */
+\fB#include <sched.h>\fP
+.sp
+\fBint unshare(int \fP\fIflags\fP\fB);\fP
+.fi
+.SH 説明
+\fBunshare\fP() を使うと、プロセスは他のプロセスと現在共有している 実行コンテキストの一部を分離することができる。
+実行コンテキストの一部、たとえばマウント名前空間 (mount namespace) などは、新しいプロセスを \fBfork\fP(2) または
+\fBvfork\fP(2) を使って生成したときに、暗黙のうちに共有される。 一方、仮想メモリなどは、 \fBclone\fP(2)
+を使ってプロセスを生成するときに、明示的に共有することを要求できる。
+
+\fBunshare\fP() の主な利用法は、プロセスが新しいプロセスを生成することなく、 共有実行コンテキストを制御することである。
+
+\fIflags\fP 引き数はビットマスクであり、 実行コンテキストのどの部分の共有を解除するかを表す。 この引き数は、以下の定数の 0 個以上の OR
+で指定する:
+.TP
+\fBCLONE_FILES\fP
+\fBclone\fP(2) \fBCLONE_FILES\fP フラグの効果を取り消す。 ファイルディスクリプタテーブルを共有させず、
+呼び出し元プロセスは他のプロセスとファイルディスクリプタを共有しなくなる。
+.TP
+\fBCLONE_FS\fP
+\fBclone\fP(2) \fBCLONE_FS\fP フラグの効果を取り消す。 ファイルシステム属性を共有させず、
+呼び出し元プロセスは他のプロセスとルートディレクトリ・ カレントディレクトリ・umask 属性を共有しなくなる。 \fBchroot\fP(2),
+\fBchdir\fP(2), \fBumask\fP(2) に影響する。
+.TP
+\fBCLONE_NEWIPC\fP (Linux 2.6.19 以降)
+このフラグは \fBclone\fP(2) \fBCLONE_NEWIPC\fP フラグと同じ効果を持つ。
+System V IPC 名前空間を共有せず、呼び出し元プロセスは 他のプロセスとは
+共有しない固有の System V IPC 名前空間のコピーを持つ。 このフラグを指定
+すると、 \fBCLONE_SYSVSEM\fP も暗黙のうちに指定される。 \fBCLONE_NEWIPC\fP を
+使用するには \fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。
+.TP
+\fBCLONE_NEWNET\fP (Linux 2.6.24 以降)
+このフラグは \fBclone\fP(2) \fBCLONE_NEWNET\fP フラグと同じ効果を持つ。ネット
+ワーク名前空間を共有せず、呼び出し元プロセスは他のプロセスとは共有しな
+い固有のネットワーク名前空間のコピーを持つ。\fBCLONE_NEWNET\fP を使用する
+には \fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。
+.TP
+\fBCLONE_NEWNS\fP
+.\" These flag name are inconsistent:
+.\" CLONE_NEWNS does the same thing in clone(), but CLONE_VM,
+.\" CLONE_FS, and CLONE_FILES reverse the action of the clone()
+.\" flags of the same name.
+このフラグは \fBclone\fP(2) \fBCLONE_NEWNS\fP フラグと同じ効果を持つ。 マウン
+ト名前空間を共有せず、呼び出し元プロセスは 他のプロセスとは共有しない固
+有の名前空間のコピーを持つ。 このフラグを指定すると、 \fBCLONE_FS\fP も暗
+黙のうちに指定される。 \fBCLONE_NEWNS\fP を使用するには \fBCAP_SYS_ADMIN\fP
+ケーパビリティが必要である。
+.TP
+\fBCLONE_SYSVSEM\fP (Linux 2.6.26 以降)
+このフラグは \fBclone\fP(2) \fBCLONE_SYSVSEM\fP フラグの効果を逆転させる。
+System V セマフォのアンドゥ値を共有せず、呼び出し元プロセスは 他のプロ
+セスとは共有しない固有のコピーを持つ。\fBCLONE_SYSVSEM\fP を使用するには
+\fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。
+.TP
+\fBCLONE_NEWUTS\fP (Linux 2.6.19 以降)
+.\" As at 2.6.16, the following forced implications also apply,
+.\" although the relevant flags are not yet implemented.
+.\" If CLONE_THREAD is set force CLONE_VM.
+.\" If CLONE_VM is set, force CLONE_SIGHAND.
+.\" CLONE_NEWNSIf CLONE_SIGHAND is set and signals are also being shared
+.\" (i.e., current->signal->count > 1), force CLONE_THREAD.
+.\"
+.\" FIXME . CLONE_VM is not (yet, as at 2.6.16) implemented.
+.\" .TP
+.\" .B CLONE_VM
+.\" Reverse the effect of the
+.\" .BR clone (2)
+.\" .B CLONE_VM
+.\" flag.
+.\" .RB ( CLONE_VM
+.\" is also implicitly set by
+.\" .BR vfork (2),
+.\" and can be reversed using this
+.\" .BR unshare ()
+.\" flag.)
+.\" Unshare virtual memory, so that the calling process no
+.\" longer shares its virtual address space with any other process.
+このフラグは \fBclone\fP(2) \fBCLONE_NEWUTS\fP フラグと同じ効果を持つ。 UTS
+IPC 名前空間を共有せず、呼び出し元プロセスは他のプロセスとは共有しない
+固有の UTS IPC 名前空間のコピーを持つ。 このフラグを指定すると、
+\fBCLONE_FS\fP も暗黙のうちに指定される。\fBCLONE_NEWUTS\fP を使用するには
+\fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。
+.PP
+\fIflags\fP に 0 が指定された場合、 \fBunshare\fP() は何も行わないので、
+呼び出し元プロセスの実行コンテキストは、何も変更されない。
+.SH 返り値
+成功した場合は 0 が返される。 失敗した場合は \-1 が返されて、 \fIerrno\fP にはエラーを示す値が設定される。
+.SH エラー
+.TP
+\fBEINVAL\fP
+\fIflags\fP に不正なビットが指定された。
+.TP
+\fBENOMEM\fP
+呼び出し元のコンテキストのうち共有を解除する必要がある部分をコピーするために、 十分なメモリが確保できなかった。
+.TP
+\fBEPERM\fP
+呼び出し元プロセスはこの操作を行うのに必要な特権を持っていなかった。
+.SH バージョン
+\fBunshare\fP() システムコールは Linux カーネル 2.6.16 で追加された。
+.SH 準拠
+\fBunshare\fP() システムコールは Linux 固有である。
+.SH 注意
+.\" However, we can do unshare(CLONE_SIGHAND) if CLONE_SIGHAND
+.\" was not specified when doing clone(); i.e., unsharing
+.\" signal handlers is permitted if we are not actually
+.\" sharing signal handlers. mtk
+.\" FIXME . check future kernel versions (e.g., 2.6.17)
+.\" to see if CLONE_VM gets implemented.
+.\" However, as at 2.6.16, we can do unshare(CLONE_VM) if CLONE_VM
+.\" was not specified when doing clone(); i.e., unsharing
+.\" virtual memory is permitted if we are not actually
+.\" sharing virtual memory. mtk
+.\"
+.\"9) Future Work
+.\"--------------
+.\"The current implementation of unshare does not allow unsharing of
+.\"signals and signal handlers. Signals are complex to begin with and
+.\"to unshare signals and/or signal handlers of a currently running
+.\"process is even more complex. If in the future there is a specific
+.\"need to allow unsharing of signals and/or signal handlers, it can
+.\"be incrementally added to unshare without affecting legacy
+.\"applications using unshare.
+.\"
+\fBclone\fP(2) で新しいプロセスを生成したときに共有される全てのプロセス属性を、 \fBunshare\fP()
+によって共有の解除ができるわけではない。 特に、カーネル 2.6.16 においては、 \fBunshare\fP() に \fBCLONE_SIGHAND\fP,
+\fBCLONE_SYSVSEM\fP, \fBCLONE_THREAD\fP, \fBCLONE_VM\fP の効果を取り消すためのフラグが実装されていない。
+これらの機能は、必要であれば将来追加されるかもしれない。
+.SH 関連項目
+\fBclone\fP(2), \fBfork\fP(2), \fBvfork\fP(2), Documentation/unshare.txt
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Copyright (C) 2006 Michael Kerrisk
+.\" and Copyright (C) 2008 Linux Foundation, written by Michael Kerrisk
+.\" <mtk.manpages@gmail.com>
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH CPU_SET 3 2012\-03\-15 Linux "Linux Programmer's Manual"
+.SH 名前
+CPU_SET, CPU_CLR, CPU_ISSET, CPU_ZERO, CPU_COUNT, CPU_AND, CPU_OR, CPU_XOR,
+CPU_EQUAL, CPU_ALLOC, CPU_ALLOC_SIZE, CPU_FREE, CPU_SET_S, CPU_CLR_S,
+CPU_ISSET_S, CPU_ZERO_S, CPU_COUNT_S, CPU_AND_S, CPU_OR_S, CPU_XOR_S,
+CPU_EQUAL_S \- macros for manipulating CPU sets
+.SH 書式
+.nf
+\fB#define _GNU_SOURCE\fP /* feature_test_macros(7) 参照 */
+\fB#include <sched.h>\fP
+.sp
+\fBvoid CPU_ZERO(cpu_set_t *\fP\fIset\fP\fB);\fP
+.sp
+\fBvoid CPU_SET(int \fP\fIcpu\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP
+\fBvoid CPU_CLR(int \fP\fIcpu\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP
+\fBint CPU_ISSET(int \fP\fIcpu\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP
+.sp
+\fBint CPU_COUNT(cpu_set_t *\fP\fIset\fP\fB);\fP
+.sp
+\fBvoid CPU_AND(cpu_set_t *\fP\fIdestset\fP\fB,\fP
+\fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP
+\fBvoid CPU_OR(cpu_set_t *\fP\fIdestset\fP\fB,\fP
+\fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP
+\fBvoid CPU_XOR(cpu_set_t *\fP\fIdestset\fP\fB,\fP
+\fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP
+.sp
+\fBint CPU_EQUAL(cpu_set_t *\fP\fIset1\fP\fB, cpu_set_t *\fP\fIset2\fP\fB);\fP
+.sp
+\fBcpu_set_t *CPU_ALLOC(int \fP\fInum_cpus\fP\fB);\fP
+\fBvoid CPU_FREE(cpu_set_t *\fP\fIset\fP\fB);\fP
+\fBsize_t CPU_ALLOC_SIZE(int \fP\fInum_cpus\fP\fB);\fP
+.sp
+\fBvoid CPU_ZERO_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP
+.sp
+\fBvoid CPU_SET_S(int \fP\fIcpu\fP\fB, size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP
+\fBvoid CPU_CLR_S(int \fP\fIcpu\fP\fB, size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP
+\fBint CPU_ISSET_S(int \fP\fIcpu\fP\fB, size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP
+.sp
+\fBint CPU_COUNT_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP
+.sp
+\fBvoid CPU_AND_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIdestset\fP\fB,\fP
+\fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP
+\fBvoid CPU_OR_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIdestset\fP\fB,\fP
+\fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP
+\fBvoid CPU_XOR_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIdestset\fP\fB,\fP
+\fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP
+.sp
+\fBint CPU_EQUAL_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset1\fP\fB, cpu_set_t *\fP\fIset2\fP\fB);\fP
+.fi
+.SH 説明
+The \fIcpu_set_t\fP data structure represents a set of CPUs. CPU sets are used
+by \fBsched_setaffinity\fP(2) and similar interfaces.
+
+The \fIcpu_set_t\fP data type is implemented as a bitset. However, the data
+structure treated as considered opaque: all manipulation of CPU sets should
+be done via the macros described in this page.
+
+The following macros are provided to operate on the CPU set \fIset\fP:
+.TP 17
+\fBCPU_ZERO\fP()
+Clears \fIset\fP, so that it contains no CPUs.
+.TP
+\fBCPU_SET\fP()
+Add CPU \fIcpu\fP to \fIset\fP.
+.TP
+\fBCPU_CLR\fP()
+Remove CPU \fIcpu\fP from \fIset\fP.
+.TP
+\fBCPU_ISSET\fP()
+Test to see if CPU \fIcpu\fP is a member of \fIset\fP.
+.TP
+\fBCPU_COUNT\fP()
+Return the number of CPUs in \fIset\fP.
+.PP
+Where a \fIcpu\fP argument is specified, it should not produce side effects,
+since the above macros may evaluate the argument more than once.
+.PP
+The first available CPU on the system corresponds to a \fIcpu\fP value of 0,
+the next CPU corresponds to a \fIcpu\fP value of 1, and so on. The constant
+\fBCPU_SETSIZE\fP (currently 1024) specifies a value one greater than the
+maximum CPU number that can be stored in \fIcpu_set_t\fP.
+
+The following macros perform logical operations on CPU sets:
+.TP 17
+\fBCPU_AND\fP()
+Store the intersection of the sets \fIsrcset1\fP and \fIsrcset2\fP in \fIdestset\fP
+(which may be one of the source sets).
+.TP
+\fBCPU_OR\fP()
+Store the union of the sets \fIsrcset1\fP and \fIsrcset2\fP in \fIdestset\fP (which
+may be one of the source sets).
+.TP
+\fBCPU_XOR\fP()
+Store the XOR of the sets \fIsrcset1\fP and \fIsrcset2\fP in \fIdestset\fP (which may
+be one of the source sets). The XOR means the set of CPUs that are in
+either \fIsrcset1\fP or \fIsrcset2\fP, but not both.
+.TP
+\fBCPU_EQUAL\fP()
+Test whether two CPU set contain exactly the same CPUs.
+.SS "Dynamically sized CPU sets"
+Because some applications may require the ability to dynamically size CPU
+sets (e.g., to allocate sets larger than that defined by the standard
+\fIcpu_set_t\fP data type), glibc nowadays provides a set of macros to support
+this.
+
+The following macros are used to allocate and deallocate CPU sets:
+.TP 17
+\fBCPU_ALLOC\fP()
+Allocate a CPU set large enough to hold CPUs in the range 0 to
+\fInum_cpus\-1\fP.
+.TP
+\fBCPU_ALLOC_SIZE\fP()
+Return the size in bytes of the CPU set that would be needed to hold CPUs in
+the range 0 to \fInum_cpus\-1\fP. This macro provides the value that can be
+used for the \fIsetsize\fP argument in the \fBCPU_*_S\fP() macros described
+below.
+.TP
+\fBCPU_FREE\fP()
+Free a CPU set previously allocated by \fBCPU_ALLOC\fP().
+.PP
+The macros whose names end with "_S" are the analogs of the similarly named
+macros without the suffix. These macros perform the same tasks as their
+analogs, but operate on the dynamically allocated CPU set(s) whose size is
+\fIsetsize\fP bytes.
+.SH 返り値
+\fBCPU_ISSET\fP() and \fBCPU_ISSET_S\fP() return nonzero if \fIcpu\fP is in \fIset\fP;
+otherwise, it returns 0.
+
+\fBCPU_COUNT\fP() and \fBCPU_COUNT_S\fP() return the number of CPUs in \fIset\fP.
+
+\fBCPU_EQUAL\fP() and \fBCPU_EQUAL_S\fP() return nonzero if the two CPU sets are
+equal; otherwise it returns 0.
+
+\fBCPU_ALLOC\fP() returns a pointer on success, or NULL on failure. (Errors
+are as for \fBmalloc\fP(3).)
+
+\fBCPU_ALLOC_SIZE\fP() returns the number of bytes required to store a CPU set
+of the specified cardinality.
+
+The other functions do not return a value.
+.SH バージョン
+The \fBCPU_ZERO\fP(), \fBCPU_SET\fP(), \fBCPU_CLR\fP(), and \fBCPU_ISSET\fP() macros
+were added in glibc 2.3.3.
+
+\fBCPU_COUNT\fP() first appeared in glibc 2.6.
+
+\fBCPU_AND\fP(), \fBCPU_OR\fP(), \fBCPU_XOR\fP(), \fBCPU_EQUAL\fP(), \fBCPU_ALLOC\fP(),
+\fBCPU_ALLOC_SIZE\fP(), \fBCPU_FREE\fP(), \fBCPU_ZERO_S\fP(), \fBCPU_SET_S\fP(),
+\fBCPU_CLR_S\fP(), \fBCPU_ISSET_S\fP(), \fBCPU_AND_S\fP(), \fBCPU_OR_S\fP(),
+\fBCPU_XOR_S\fP(), and \fBCPU_EQUAL_S\fP() first appeared in glibc 2.7.
+.SH 準拠
+These interfaces are Linux\-specific.
+.SH 注意
+To duplicate a CPU set, use \fBmemcpy\fP(3).
+
+Since CPU sets are bitsets allocated in units of long words, the actual
+number of CPUs in a dynamically allocated CPU set will be rounded up to the
+next multiple of \fIsizeof(unsigned long)\fP. An application should consider
+the contents of these extra bits to be undefined.
+
+Notwithstanding the similarity in the names, note that the constant
+\fBCPU_SETSIZE\fP indicates the number of CPUs in the \fIcpu_set_t\fP data type
+(thus, it is effectively a count of bits in the bitset), while the
+\fIsetsize\fP argument of the \fBCPU_*_S\fP() macros is a size in bytes.
+
+The data types for arguments and return values shown in the SYNOPSIS are
+hints what about is expected in each case. However, since these interfaces
+are implemented as macros, the compiler won't necessarily catch all type
+errors if you violate the suggestions.
+.SH バグ
+.\" http://sourceware.org/bugzilla/show_bug.cgi?id=7029
+On 32\-bit platforms with glibc 2.8 and earlier, \fBCPU_ALLOC\fP() allocates
+twice as much space as is required, and \fBCPU_ALLOC_SIZE\fP() returns a value
+twice as large as it should. This bug should not affect the semantics of a
+program, but does result in wasted memory and less efficient operation of
+the macros that operate on dynamically allocated CPU sets. These bugs are
+fixed in glibc 2.9.
+.SH EXAMPLE
+The following program demonstrates the use of some of the macros used for
+dynamically allocated CPU sets.
+
+.nf
+#define _GNU_SOURCE
+#include <sched.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <assert.h>
+
+int
+main(int argc, char *argv[])
+{
+ cpu_set_t *cpusetp;
+ size_t size;
+ int num_cpus, cpu;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s <num\-cpus>\en", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ num_cpus = atoi(argv[1]);
+
+ cpusetp = CPU_ALLOC(num_cpus);
+ if (cpusetp == NULL) {
+ perror("CPU_ALLOC");
+ exit(EXIT_FAILURE);
+ }
+
+ size = CPU_ALLOC_SIZE(num_cpus);
+
+ CPU_ZERO_S(size, cpusetp);
+ for (cpu = 0; cpu < num_cpus; cpu += 2)
+ CPU_SET_S(cpu, size, cpusetp);
+
+ printf("CPU_COUNT() of set: %d\en", CPU_COUNT_S(size, cpusetp));
+
+ CPU_FREE(cpusetp);
+ exit(EXIT_SUCCESS);
+}
+.fi
+.SH 関連項目
+\fBsched_setaffinity\fP(2), \fBpthread_attr_setaffinity_np\fP(3),
+\fBpthread_setaffinity_np\fP(3), \fBcpuset\fP(7)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Copyright (c) 1990, 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Chris Torek and the American National Standards Committee X3,
+.\" on Information Processing Systems.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)fopen.3 6.8 (Berkeley) 6/29/91
+.\"
+.\" Converted for Linux, Mon Nov 29 15:22:01 1993, faith@cs.unc.edu
+.\" Modified, aeb, 960421, 970806
+.\" Modified, joey, aeb, 2002-01-03
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH FOPEN 3 2012\-04\-22 GNU "Linux Programmer's Manual"
+.SH 名前
+fopen, fdopen, freopen \- ストリームを開く関数
+.SH 書式
+.nf
+\fB#include <stdio.h>\fP
+.sp
+\fBFILE *fopen(const char *\fP\fIpath\fP\fB, const char *\fP\fImode\fP\fB);\fP
+
+\fBFILE *fdopen(int \fP\fIfd\fP\fB, const char *\fP\fImode\fP\fB);\fP
+
+\fBFILE *freopen(const char *\fP\fIpath\fP\fB, const char *\fP\fImode\fP\fB, FILE *\fP\fIstream\fP\fB);\fP
+.fi
+.sp
+.in -4n
+glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照):
+.in
+.sp
+\fBfdopen\fP(): _POSIX_C_SOURCE\ >=\ 1 || _XOPEN_SOURCE || _POSIX_SOURCE
+.SH 説明
+\fBfopen\fP() 関数は、 \fIpath\fP で指定された名前のファイルを開き、ストリームと結びつける。
+.PP
+引数 \fImode\fP は、以下に続く文字のひとつから始まる文字列へのポインタであ
+る (以下の述べる、追加の文字が後に続くこともある):
+.TP
+\fBr\fP
+テキストファイルを読み出すために開く。 ストリームはファイルの先頭に位置される。
+.TP
+\fBr+\fP
+読み出しおよび書き込みするために開く。 ストリームはファイルの先頭に位置される。
+.TP
+\fBw\fP
+ファイルを書き込みのために開く。 ファイルが既に存在する場合には長さゼロに切り詰める。 ファイルがなかった場合には新たに作成する。
+ストリームはファイルの先頭に位置される。
+.TP
+\fBw+\fP
+読み出しおよび書き込みのために開く。 ファイルが存在していない場合には新たに作成する。 存在している場合には長さゼロに切り詰められる。
+ストリームはファイルの先頭に位置される。
+.TP
+\fBa\fP
+追加 (ファイルの最後に書き込む) のために開く。 ファイルが存在していない場合には新たに作成する。 ストリームはファイルの最後に位置される。
+.TP
+\fBa+\fP
+読み出しおよび追加 (ファイルの最後に書き込む) のために開く。 ファイルが存在していない場合には新たに作成する。
+読み出しの初期ファイル位置はファイルの先頭であるが、 書き込みは常にファイルの最後に追加される。
+.PP
+\fImode\fP 文字列には文字 \(aqb\(aq を追加指定することができ、 \fImode\fP 文字列の最後の文字として指定する。 上記のうち 2
+文字のモードの場合には 2 つの文字の間に指定することもできる。 これは C89 との互換性のためだけに用意された
+ものであり、関数の実行に対してはいかなる影響も持たない。 すなわち、Linux を含む全ての POSIX 準拠システムでは、 この \(aqb\(aq
+は無視される。 (その他のシステムではテキストファイルとバイナリファイルを別々に扱うものもあるので、 もしバイナリファイルの入出力を行い、
+そのプログラムが非 UNIX 環境へ移植されると予測するなら、 \(aqb\(aqを付けておくのは良い考えである)
+.PP
+\fImode\fP の glibc による拡張の詳細については下記の「注意」を参照。
+.PP
+すべての生成されたファイルは、 \fBS_IRUSR\fP | \fBS_IWUSR\fP | \fBS_IRGRP\fP | \fBS_IWGRP\fP |
+\fBS_IROTH\fP | \fBS_IWOTH\fP (0666) のモードを そのプロセスの umask 値によって修正したモードを持つ
+(\fBumask\fP(2) を見よ)。
+.PP
+読み出し/書き込みストリームに対しては任意の順序で読み書きを行うことができる。 ただし ANSI C では、
+(入力操作がファイルの末尾に到達した場合を除いて) 出力と入力の間にはファイルの位置決め関数を 挟まなければならないことになっていることに注意されたい
+(この条件を満足しない場合には、読み込み操作は、 最後に書き込まれたものでなく、以前に書き込まれた 値を返すことを許されている)。
+したがって、このようなストリームでの読み書き操作の間には \fBfseek\fP(3) または \fBfgetpos\fP(3) 操作を挟んでおくと良いだろう
+(Linux では本当に必要となることもときどきある)。 この操作は見かけ上何もしない操作 (no\-op) でも良い (例えば \fIfseek(...,
+0L, SEEK_CUR)\fP を その副次的効果である同期のためだけに呼べば良い)。
+.PP
+ファイルを追加モード (\fImode\fP の最初の文字を \fBa\fP にする) で開くと、
+このストリームに対する書き込み操作は全て (先に以下の呼び出しを行った
+かのように) ファイルの末尾で行われる。
+.nf
+
+ fseek(stream,0,SEEK_END);
+.fi
+.PP
+\fBfdopen\fP() 関数は、既存のファイル記述子 \fIfd\fP にストリームを結びつける。 ストリームの \fImode\fP ("r", "r+",
+"w", "w+", "a", "a+" のいずれか) は ファイル記述子のモードと互換のものでなければならない。
+新しいストリームのファイル位置指示子は \fIfd\fP に属している値に設定される。 error と end\-of\-file の各指示子はクリアされる。
+"w" および "w+" モードでのファイルの切り詰めは行われない。 ファイル記述子の複製は行なわれない。 \fBfdopen\fP()
+で作成されたストリームが閉じられたときにファイル記述子も 閉じられる。 共有メモリのオブジェクトへ \fBfdopen\fP()
+を行ったときの結果は定義されていない。
+.PP
+\fBfreopen\fP() 関数は \fIpath\fP で名前が指定されたファイルを開き、 \fIstream\fP
+で指定されたストリームに、そのファイルを結びつける。 もとのストリームは (もし存在する場合には) 閉じられる。 \fImode\fP 引数は
+\fBfopen\fP() 関数と同じ形で使われる。 \fBfreopen\fP() 関数の主な用途は、標準テキストストリーム (\fIstderr\fP,
+\fIstdin\fP, \fIstdout\fP) と対応付けられているファイルを変更することである。
+.SH 返り値
+\fBfopen\fP(), \fBfdopen\fP(), \fBfreopen\fP() は成功すると \fIFILE\fP 型のポインタを返す。 失敗すると NULL
+が返され、 \fIerrno\fP がエラーを示す値にセットされる。
+.SH エラー
+.TP
+\fBEINVAL\fP
+\fBfopen\fP(), \fBfdopen\fP(), \fBfreopen\fP() で与えられた \fImode\fP が不適切である。
+.PP
+\fBfopen\fP(), \fBfdopen\fP(), \fBfreopen\fP() 関数は \fBmalloc\fP(3)
+ルーチンで規定されているエラーでも失敗することがあり、 その時は対応する値に \fIerrno\fP をセットする。
+.PP
+\fBfopen\fP() 関数は \fBopen\fP(2) ルーチンで規定されているエラーでも失敗することがあり、 その時は対応する値に \fIerrno\fP
+をセットする。
+.PP
+\fBfdopen\fP() 関数は \fBfcntl\fP(2) ルーチンで規定されているエラーでも失敗することがあり、 その時は対応する値に
+\fIerrno\fP をセットする。
+.PP
+\fBfreopen\fP() 関数は \fBopen\fP(2), \fBfclose\fP(3), \fBfflush\fP(3)
+各ルーチンで規定されているエラーでも失敗することがあり、 その時は対応する値に \fIerrno\fP をセットする。
+.SH 準拠
+\fBfopen\fP() 関数と \fBfreopen\fP() 関数は C89に準拠している。 \fBfdopen\fP() 関数は POSIX.1\-1990
+に準拠している。
+.SH 注意
+.SS "glibc での注意"
+GNU C ライブラリでは、 \fImode\fP に指定できる文字列として、以下の拡張が行われている:
+.TP
+\fBc\fP (glibc 2.3.3 以降)
+open 操作、それに続く read/write 操作の、 スレッドの取り消しポイント
+(cancellation points) を作成しない。
+このフラグは \fBfdopen\fP() では無視される。
+.TP
+\fBe\fP (glibc 2.7 以降)
+\fBO_CLOEXEC\fP フラグを有効にしてファイルをオープンする。詳細は
+\fBopen\fP(2) を参照。このフラグは \fBfdopen\fP() では無視される。
+.TP
+\fBm\fP (glibc 2.3 以降)
+.\" As at glibc 2.4:
+I/O システムコール (\fBread\fP(2), \fBwrite\fP(2)) ではなく、 \fBmmap\fP(2)
+を使ってファイルにアクセスしようとする。 \fBmmap\fP(2) を使おうとするのは、読み出し用にオープンするファイルについてだけである。
+.TP
+\fBx\fP
+.\" Since glibc 2.0?
+.\" FIXME C11 specifies this flag
+ファイルを排他的にオープンする (\fBopen\fP(2) の \fBO_EXCL\fP フラグと同様)。 ファイルがすでに存在する場合、 \fBfopen\fP()
+は失敗し、 \fIerrno\fP に \fBEEXIST\fP がセットされる。 このフラグは \fBfdopen\fP() では無視される。
+.PP
+上記の文字に加えて、
+\fBfopen\fP() と \fBfreopen\fP() では \fImode\fP に
+以下の書式を 指定することができる。
+
+\fB ,ccs=\fP\fIstring\fP
+
+指定された \fIstring\fP は、符号化文字集合の名前と解釈され、
+ストリームではワイド文字のストリームとして扱われる。
+内部変換関数で入出力時に文字集合 \fIstring\fP との変換が行われる。
+書式 \fB,ccs=\fP\fIstring\fP が指定されない場合は、
+ストリームをワイド文字のストリームとして扱うかは
+最初のファイル操作時に決定される。
+最初のファイル操作がワイド文字操作であった場合は、
+そのストリームはワイド文字のストリームとして扱われ、
+符号化文字集合との変換を行う関数が読み込まれる。
+.SH バグ
+.\" FIXME http://sourceware.org/bugzilla/show_bug.cgi?id=12685
+\fImode\fP の個々のフラグ文字 ("ccs" 指定の前の文字) を解釈する際に、
+glibc の \fBfopen\fP() と \fBfreopen\fP() の実装では、
+\fImode\fP の確認を最大 7 文字しか行わないという制限がある
+(バージョン 2.14 より前の glibc では最大 6 文字だが、
+6 文字では "rb+cmxe" などの指定を行うには不十分であった)。
+\fBfdopen\fP() の現在の実装では最大 5 文字の \fImode\fP しか解釈されない。
+.SH 関連項目
+\fBopen\fP(2), \fBfclose\fP(3), \fBfileno\fP(3), \fBfmemopen\fP(3), \fBfopencookie\fP(3)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Copyright (c) 2008, Linux Foundation, written by Michael Kerrisk
+.\" <mtk.manpages@gmail.com>
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH GETUTMP 3 2010\-09\-10 Linux "Linux Programmer's Manual"
+.SH 名前
+getutmp, getutmpx \- utmp 構造体から utmpx 構造体、その逆のコピーを行う
+.SH 書式
+.nf
+\fB#define _GNU_SOURCE\fP /* feature_test_macros(7) 参照 */
+\fB#include <utmpx.h>\fP
+
+\fB void getutmp(const struct utmpx *\fP\fIux\fP\fB, struct utmp *\fP\fIu\fP\fB);\fP
+\fB void getutmpx(const struct utmp *\fP\fIu\fP\fB, struct utmpx *\fP\fIux\fP\fB);\fP
+.fi
+.SH 説明
+\fBgetutmp\fP() 関数は、 \fIux\fP が指す \fIutmpx\fP 構造体の各フィールドを、
+\fIu\fP が指す \fIutmp\fP 構造体の対応するフィールドにコピーする。
+\fBgetutmpx\fP() 関数は逆の操作を行う。
+.SH 返り値
+これらの関数は値を返さない。
+.SH バージョン
+これらの関数は glibc バージョン 2.1.1 で初めて登場した。
+.SH 準拠
+これらの関数は非標準である。
+Linux 以外にも、これらの関数が存在するシステムもいくつかある
+(Solaris や NetBSD など)。
+.SH 注意
+.\" e.g., on Solaris, the utmpx structure is rather larger than utmp.
+これらの関数が存在する一番の目的は、
+\fIutmp\fP 構造体と \fIutmpx\fP 構造体が異なるフィールドを持たり、
+対応するフィールドの大きさが異なっている、他のシステムとの
+互換性のためである。
+Linux では、これらの構造体は同じフィールドを持っており、
+各フィールドのサイズも同じである。
+.SH 関連項目
+\fBgetutent\fP(3), \fButmp\fP(5)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Copyright (c) 2001 by John Levon <moz@compsoc.man.ac.uk>
+.\" Based in part on GNU libc documentation.
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\" License.
+.\"
+.\" 2001-10-11, 2003-08-22, aeb, added some details
+.\" 2012-03-23, Michael Kerrisk <mtk.manpages@mail.com>
+.\" Document pvalloc() and aligned_alloc()
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH POSIX_MEMALIGN 3 2012\-03\-23 GNU "Linux Programmer's Manual"
+.SH 名前
+posix_memalign, aligned_alloc, memalign, valloc, pvalloc \- アラインメント
+されたメモリの割り当てを行う
+.SH 書式
+.nf
+\fB#include <stdlib.h>\fP
+.sp
+\fBint posix_memalign(void **\fP\fImemptr\fP\fB, size_t \fP\fIalignment\fP\fB, size_t \fP\fIsize\fP\fB);\fP
+\fBvoid *aligned_alloc(size_t \fP\fIalignment\fP\fB, size_t \fP\fIsize\fP\fB);\fP
+\fBvoid *valloc(size_t \fP\fIsize\fP\fB);\fP
+.sp
+\fB#include <malloc.h>\fP
+.sp
+\fBvoid *memalign(size_t \fP\fIalignment\fP\fB, size_t \fP\fIsize\fP\fB);\fP
+\fBvoid *pvalloc(size_t \fP\fIsize\fP\fB);\fP
+.fi
+.sp
+.in -4n
+glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照):
+.in
+.sp
+.ad l
+\fBposix_memalign\fP(): _POSIX_C_SOURCE\ >=\ 200112L || _XOPEN_SOURCE\ >=\ 600
+.sp
+\fBaligned_alloc\fP(): _ISOC11_SOURCE
+.sp
+\fBvalloc\fP():
+.br
+.PD 0
+.RS 4
+.TP 4
+glibc 2.12 以降:
+.nf
+_BSD_SOURCE ||
+ (_XOPEN_SOURCE\ >=\ 500 ||
+ _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED) &&
+ !(_POSIX_C_SOURCE\ >=\ 200112L || _XOPEN_SOURCE\ >=\ 600)
+.br
+.fi
+.TP
+glibc 2.12 より前:
+_BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500 || _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED
+.ad b
+.br
+((非標準の) ヘッダファイル \fI<malloc.h>\fP も
+\fBvalloc\fP() の宣言も公開する。機能検査マクロは不要である。
+.RE
+.PD
+.SH 説明
+.\" glibc does this:
+関数 \fBposix_memalign\fP() は、 \fIsize\fP バイトのメモリを割り当て、割り当てられたメモリのアドレスを \fI*memptr\fP
+に設定する。 割り当てられたメモリのアドレスは \fIalignment\fP の倍数になっているはずである。 \fIalignment\fP は 2
+のべき乗で、かつ \fIsizeof(void *)\fP の倍数でなければならない。 \fIsize\fP が 0 の場合、
+\fBposix_memalign\fP() は NULL か一意なポインタ値を返す。 このポインタ値は、後で \fBfree\fP(3)
+に問題なく渡すことができる。
+
+.\" The behavior of memalign() for size==0 is as for posix_memalign()
+.\" but no standards govern this.
+廃止された関数である \fBmemalign\fP() は、 \fIsize\fP バイトのメモリを割り当て、
+割り当てられたメモリへのポインタを返す。 メモリのアドレスは \fIalignment\fP
+の倍数になっているはずである。 \fIalignment\fP は 2 のべき乗でなければならない。
+
+関数 \fBaligned_alloc\fP() は \fBmemalign\fP() と同じだが、\fIsize\fP が \fIalignment\fP
+の倍数でなければならないという追加の制限がある点が異なる。
+
+
+廃止された関数である \fBvalloc\fP() は \fIsize\fP バイトのメモリを割り当て、割り当てられたメモリへのポインタを返す。
+メモリのアドレスはページサイズの倍数になっているはずである。 これは \fImemalign(sysconf(_SC_PAGESIZE),size)\fP
+と等価である。
+
+廃止された関数 \fBpvalloc\fP() は \fBvalloc\fP() と同様だが、
+割り当てられるサイズがシステムのページサイズの倍数に切り上げられる。
+
+これらの関数はいずれもメモリのゼロクリアを行わない。
+.SH 返り値
+\fBaligned_alloc\fP(), \fBmemalign\fP(), \fBvalloc\fP(), \fBpvalloc\fP() は割り当てられた
+メモリへのポインタを返す。 割り当てに失敗した場合は NULL を返す。
+
+\fBposix_memalign\fP() は成功した場合は 0 を返し、 失敗した場合は次のセクションに記載されたエラー値のいずれかを返す。
+\fIerrno\fP はセットされないことに注意すること。
+.SH エラー
+.TP
+\fBEINVAL\fP
+\fIalignment\fP 引き数が 2 のべき乗でなかったか、 \fIsizeof(void *)\fP の倍数でなかった。
+.TP
+\fBENOMEM\fP
+割り当て要求を満たすのに十分なメモリがなかった。
+.SH バージョン
+関数 \fBmemalign\fP(), \fBvalloc\fP(), \fBpvalloc\fP() は
+すべての Linux libc ライブラリで使用可能である。
+
+関数 \fBaligned_alloc\fP() は glibc バージョン 2.16 で追加された。
+
+関数 \fBposix_fallocate\fP() は glibc 2.1.91 以降で利用可能である。
+.SH 準拠
+関数 \fBvalloc\fP() は 3.0BSD で登場した。4.3BSD では廃止されたと記載されており、
+SUSv2 では過去の名残だと記載されている。 POSIX.1\-2001 には存在しない。
+
+関数 \fBpvalloc\fP() は GNU による拡張である。
+
+関数 \fBmemalign\fP() は SunOS 4.1.3 で登場したが、4.4BSD にはない。
+
+関数 \fBposix_memalign\fP() は POSIX.1d に由来する。
+
+.\"
+関数 \fIaligned_alloc\fP() は C11 標準で規定されている。
+.SS ヘッダ
+\fBposix_memalign\fP() の宣言を \fI<stdlib.h>\fP で行うことに関しては、 皆の意見が一致している。
+
+いくつかのシステムでは、 \fBmemalign\fP() は \fI<malloc.h>\fP ではなく
+\fI<stdlib.h>\fP で宣言されている。
+
+SUSv2 によると、 \fBvalloc\fP() は \fI<stdlib.h>\fP で宣言される。 libc4,5
+や glibc では \fI<malloc.h>\fP で宣言されており、 さらに適切な機能検査
+マクロが定義された場合には \fI<stdlib.h>\fP でも宣言される(上記を参照)。
+.SH 注意
+多くのシステムでは、アラインメントに関して制限がある。例えば、 ブロックデバイスに対するダイレクト I/O に使用するバッファには
+アラインメントに関する制限がある。 POSIX では、どんなアラインメントが必要かを知るために
+\fIpathconf(path,_PC_REC_XFER_ALIGN)\fP コールを規定している。ここで \fBposix_memalign\fP()
+を使うと、この必要条件を満たすことができる。
+
+\fBposix_memalign\fP() は \fIalignment\fP が上で詳細に述べた必要条件を満たすか
+どうかを確かめる。 \fBmemalign\fP() は \fIalignment\fP 引き数が正しいかどうかの
+確認を行わないかもしれない。
+
+.\" Other systems allow passing the result of
+.\" .IR valloc ()
+.\" to
+.\" .IR free (3),
+.\" but not to
+.\" .IR realloc (3).
+POSIX では \fBposix_memalign\fP() によって獲得したメモリは \fBfree\fP(3) を
+使って解放することができる必要がある。 いくつかのシステムでは
+\fBmemalign\fP() や\fBvalloc\fP() で割り当てられたメモリを再利用する手段が
+提供されていない(なぜなら \fBfree\fP(3) に渡すことができるのは
+\fBmalloc\fP(3) から受け取ったポインタだけだが、例えば \fBmemalign\fP() は
+\fBmalloc\fP(3) を呼び出し、得た値をアラインメントしてしまうからである)。
+glibc の実装では、 ここに述べた関数のいずれで獲得したメモリも
+\fBfree\fP(3) で再利用することができる。
+
+glibc の \fBmalloc\fP(3) は常に 8 バイトにアラインメントされたメモリアドレスを
+返すので、ここで述べた関数が必要になるのは 8 バイトよりも大きなアラインメント
+が必要な場合だけである。
+.SH 関連項目
+\fBbrk\fP(2), \fBgetpagesize\fP(2), \fBfree\fP(3), \fBmalloc\fP(3)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Copyright (c) 1987, 1990, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)hostname.7 8.2 (Berkeley) 12/30/93
+.\" $FreeBSD: src/share/man/man7/hostname.7,v 1.7 2004/07/03 18:29:23 ru Exp $
+.\"
+.\" 2008-06-11, mtk, Taken from FreeBSD 6.2 and modified for Linux.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH HOSTNAME 7 2010\-11\-07 Linux "Linux Programmer's Manual"
+.SH 名前
+hostname \- ホスト名の名前解決の説明
+.SH 説明
+ホスト名は、階層構造でドット区切りのサブドメインである。
+例えば、 EDU ドメインの Berkeley サブドメインのマシン monet は、
+"monet.Berkeley.EDU" と表現される。
+
+ホスト名は、ネットワーククライアントやサーバのプログラムでは一般的に
+使用され、使用する際には名前からアドレスに変換しなければならない (一般
+的にはアドレスへの変換処理は \fBgetaddrinfo\fP(3) か (廃止予定の)
+\fBgethostbyname\fP(3) で行われる)。ホスト名の解決は、
+インターネット・ネームリゾルバによって以下の方法で実行される。
+
+ホスト名がドットを含まない単一要素で構成されていて、環境変数
+\fBHOSTALIASES\fP にファイル名が設定されている場合、入力されたホスト名に
+マッチする文字列を検索するのに指定されたファイルが使用される。
+そのファイルの各行は、ホワイトスペースで区切られた文字列 2 つで
+構成され、各行の最初の文字列がホスト名のエイリアス (別名) で、
+二番目の文字列がそのエイリアスに対応する完全なホスト名である。
+解決するホスト名と一致するホスト名のエイリアス (ファイルの各行の最初の
+フィールド) が見つかれば、完全なホスト名に置き換えられ、
+それ以上の変換処理は行わずに、そのホスト名で検索処理が行われる
+(ホスト名とエイリアスの照合では大文字、小文字の違いは無視される)。
+
+入力されたホスト名の末尾がドットの場合、
+末尾のドットは削除され、それ以上の処理は行われず、
+(末尾のドットを削除した) 残りの名前で検索が行われる。
+
+入力された名前の末尾がドットでない場合、
+マッチするものが見つかるまでドメインのリストの検索が行われる。
+デフォルトのドメインの検索リストは、先頭ローカルのドメインで、
+親ドメインが (長いものから順に) 続く (親ドメインはドット区切りで
+少なくとも 2 要素あるものだけが使用される)。
+例えば、 CS.Berkeley.EDU ドメインで、
+lithium.CChem というホスト名の場合には、
+最初に lithium.CChem.CS.Berkeley.EDU が確認され、
+次に lithium.CChem.Berkeley.EDU が確認される。
+Lithium.CChem.EDU はチェックされない。
+なぜなら、ローカルドメイン CS.Berkeley.EDU で残っているドメインは
+EDU で、これは一つしか要素がないからである。
+検索リストはシステム全体で共通の設定ファイルでデフォルト値から
+変更できる (\fBresolver\fP(5) 参照)。
+.SH 関連項目
+.\" .SH HISTORY
+.\" Hostname appeared in
+.\" 4.2BSD.
+\fBgethostbyname\fP(3), \fBresolver\fP(5), \fBmailaddr\fP(7), \fBnamed\fP(8)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。
--- /dev/null
+.\" Copyright (c) 1990, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)mdoc.samples.7 8.2 (Berkeley) 12/30/93
+.\" $Id: mdoc.samples.7,v 1.17 1998/12/03 03:38:45 jkoshy Exp $
+.\"
+.\" This tutorial sampler invokes every macro in the package several
+.\" times and is guaranteed to give a worst case performance
+.\" for an already extremely slow package.
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.Dd December 30, 1993
+.Os
+.Dt MDOC.SAMPLES 7
+.Sh 名前
+.Nm mdoc.samples
+.Nd
+.Nm \-mdoc
+を使って
+.Bx
+マニュアルを書くためのチュートリアルサンプル
+.Sh 書式
+.Nm man mdoc.samples
+.Sh 説明
+.Xr troff 1
+用の
+.Em コンテントベース
+でかつ
+.Em 領域ベース
+なフォーマットパッケージである
+.Nm \-mdoc
+マクロパッケージを使って
+.Bx
+マニュアルを書くためのチュートリアルサンプルです。
+前身である
+.Xr \-man 7
+パッケージはフォントの操作や他の写植方法の
+詳細は個々の作者に任せたページレイアウトベースのものでした。
+.Nm \-mdoc
+では、ページレイアウトマクロは
+タイトル、セクションのヘッダ、ディスプレイ、リストのマクロからなる
+.Em "ページ構造領域"
+を形成しています。これらの項目は整形された
+ページでのテキストの物理的な位置に影響を持ちます。
+ページ構造領域に加え、さらにマニュアル領域および一般テキスト領域
+の 2 つの領域があります。
+一般テキスト領域はテキストの一部をクォートしたり、
+強調するといったような作業を実行するマクロとして定義されています。
+マニュアル領域はコマンドやルーチン、それに
+.Bx
+の関連ファイルを記述するための日常使用されるインフォーマルな言葉の
+サブセットであるマクロとして定義されています。
+マニュアル領域のマクロはコマンド名、コマンド行の引数とオプション、
+関数名、関数のパラメータ、パス名、変数名、他のマニュアルページへの
+クロスリファレンスなどを扱います。
+これらの領域の項目は作者とマニュアルページの将来のユーザの両者に
+とって価値のあるものです。
+マニュアル間で一貫性を高めることによって将来のドキュメントツールへの
+移行が容易になることが望まれます。
+.Pp
+マニュアルのエントリは、実際の長さに関わらず、
+また男女の区別をするような意図なしで、
+.Ux
+のマニュアルページを通して、
+単純に man ページとして参照されています。
+.Sh さあ、始めよう
+通常チュートリアルドキュメントは、そこに示された題材をすぐに使いたい時
+に読むものですので、このドキュメントのユーザはせっかちな人だと仮定して
+います。このドキュメントの残りの部分で説明されている題材は以下のような
+構成になっています。
+.Bl -enum -offset indent
+.It
+.Tn "TROFF に特有な表現"
+.Bl -tag -width flag -compact -offset indent
+.It "マクロの使用方法"
+.It "引数に空白文字を指定する"
+.It 行末の空白文字 (警告)
+.It 特殊文字のエスケープ
+.El
+.It
+.Tn "MAN ページの分析"
+.Bl -tag -width flag -compact -offset indent
+.It "マニュアルページのテンプレート"
+.El
+.It
+.Tn "タイトルマクロ"
+.It
+.Tn "マニュアルと一般テキスト領域の紹介"
+.Bl -tag -width flag -compact -offset indent
+.It "この名前には何が...?"
+.It "一般的な構文"
+.El
+.It
+.Tn "マニュアル領域"
+.Bl -tag -width flag -compact -offset indent
+.It アドレス
+.It "作者名"
+.It 引数
+.It "コンフィギュレーション宣言 (セクション 4 のみ)"
+.It "コマンド修飾子"
+.It "定義済みの変数"
+.It "errno (セクション 2 のみ)"
+.It "環境変数"
+.It "関数の引数"
+.It "関数の宣言"
+.It フラグ
+.It "関数 (ライブラリルーチン)"
+.It "関数の型"
+.\" .It "Header File (including source code)" .
+.It "対話的なコマンド"
+.It 名前
+.It オプション
+.It パス名
+.It 変数
+.It 相互参照
+.El
+.It
+.Tn "一般テキスト領域"
+.Bl -tag -width flag -compact -offset indent
+.It "AT&T マクロ"
+.It "BSD マクロ"
+.It "FreeBSD マクロ"
+.It "UNIX マクロ"
+.It "囲い/クォートマクロ"
+.Bl -tag -width flag -compact -offset indent
+.It "カギ括弧 <> によるクォート/囲い"
+.It "角括弧 [] によるクォート/囲い"
+.It "二重引用符マクロ/囲い"
+.It "括弧 () によるクォート/囲い"
+.It "一重引用符によるクォート/囲い"
+.It "プレフィックスマクロ"
+.El
+.It "no\-op もしくは通常テキストマクロ"
+.It "空白なしマクロ"
+.It "セクションの相互参照"
+.It "相互参照と引用"
+.It "返り値 (セクション 2, 3 のみ)"
+.It "商標名 (頭字語とタイプ名)"
+.It "拡張引数"
+.El
+.It
+.Tn "ページ構造領域"
+.Bl -tag -width flag -compact -offset indent
+.It "セクションヘッダ"
+.It "段落と行スペース"
+.It "キープ"
+.It "ディスプレイ"
+.It "フォントモード (強調、リテラル、およびシンボリック)"
+.It "リストと列"
+.El
+.It
+.Tn "定義済みの文字列"
+.It
+.Tn "診断"
+.It
+.Tn "GROFF、TROFF、NROFF を使用したフォーマッティング"
+.It
+.Tn "バグ"
+.El
+.ne 7
+.Sh TROFF に特有な表現
+.Nm \-mdoc
+パッケージは man ページを記述するプロセスを簡単にすること
+を目的としています。
+.Nm \-mdoc
+を使うために
+.Xr troff 1
+の
+ゴタゴタした詳細を学ぶ必要がないのが理想ですが、いくつか片付けるべき
+避けられない制限事項があります。また、このパッケージは高速で
+.Em ない
+ということも予め警告しておきます。
+.Ss マクロの使用方法
+.Xr troff 1
+のように、マクロは
+.Ql \&.
+(ドット文字) を行頭に置き、
+それに続けて 2 文字からなるマクロの名称を指定することによって呼び出され
+ます。引数はマクロの後にスペースで区切って指定することができます。
+行頭にドット文字を指定することによって
+.Xr troff 1
+にそれに続く 2 文
+字をマクロ名として解釈するよう指示しています。マクロを起動せずに、ある
+文脈の行の先頭に
+.Ql \&.
+(ドット文字) を置くためには、
+.Ql \&.
+(ドット) の前にエスケープシーケンス
+.Ql \e&
+を指定します。
+.Ql \e&
+は文字通りスペース幅が 0 として解釈され、出力には現れません。
+.Pp
+一般的に
+.Xr troff 1
+マクロは引数を 9 つまで取ることができ、
+それ以上指定された引数は無視されます。
+.Nm \-mdoc
+でのほとんどのマクロは 9 つの引数を取ることができ、
+限られた場合にのみ引数は次の行に続けて指定することができます
+(
+.Sx 拡張引数
+セクションを参照)。
+いくつかのマクロは引用符に囲まれた引数を扱うことができます
+(下の
+.Sx 引数に空白文字を指定する
+セクションを参照)。
+.Pp
+.Nm \-mdoc
+での一般テキスト領域とマニュアル領域のほとんどのマクロは特別であり、
+その引数のリストは呼び出し可能なマクロ名として
+.Em 解析
+されます。
+これは一般テキスト領域またはマニュアル領域のマクロ名に一致し、
+呼び出し可能であると判断された引数リストの中の引数は、
+実行されるか、それが処理される時に呼び出されることを意味しています。
+この場合、引数はマクロ名にも関わらず、
+.Ql \&.
+(ドット) で前置されません。
+このようにしてたくさんのマクロを入れ子にすることができます。
+例えばオプションマクロ
+.Ql \&.Op
+はフラグマクロ
+.Ql \&Fl
+と
+引数マクロ
+.Ql \&Ar
+を
+.Em 呼び出して
+、
+オプションのフラグを引数とともに指定することができます。
+.Bl -tag -width "\&.Op \&Fl s \&Ar bytes" -offset indent
+.It Op Fl s Ar bytes
+は
+.Li \&.Op \&Fl s \&Ar bytes
+によって生成される
+.El
+.Pp
+2 文字からなる文字列をマクロ名として解釈されないようにするには、
+その文字列の前にエスケープシーケンス
+.Ql \e&
+を指定します。
+.Bl -tag -width "\&.Op \&Fl s \&Ar bytes" -offset indent
+.It Op \&Fl s \&Ar bytes
+は
+.Li \&.Op \e&Fl s \e&Ar bytes
+によって生成される
+.El
+.Pp
+ここで文字列
+.Ql \&Fl
+と
+.Ql \&Ar
+はマクロとして解釈されていませ
+ん。本ドキュメントと関連のクイックリファレンスマニュアル
+.Xr mdoc 7
+を通して、引数リストが呼び出し可能な引数として解析されるマクロは「解析
+される」、引数リストから呼び出されることができるマクロは「呼び出し可能」
+と表現します。
+.Nm \-mdoc
+のほとんどすべてのマクロは解析されるのです
+から、これは技術的には
+.Em 不謹慎な
+ことですが、常にマクロを「呼び出
+し可能である」とか「他のマクロを呼び出すことができる」と表現するのは面
+倒なことであるため、「解析される」という用語が使われています。
+.Ss 引数に空白文字を指定する
+ひとつ以上の空白文字を含む文字列をひとつの引数として指定したい場合がよ
+くあります。これは 9 個を越える引数を指定できないという制限に対処したり、
+引数のリストにある特有な配置をおこなうことが必要なマクロに引数を指定す
+るような場合に必要となることがあります。
+たとえば、関数マクロ
+.Ql \&.Fn
+では最初の引数は関数名であり、残りの
+引数が関数のパラメータであることが必要です。
+.Tn "ANSI C"
+の括弧で
+囲まれたパラメータリストにおける関数のパラメータの宣言の規定により、
+各パラメータは最低でも 2 語の文字列となります。
+たとえば
+.Fa int foo
+のようになります。
+.Pp
+空白を含む引数を指定するには 2 通りの方法があります。
+.Em 実装上の注意 :
+解析の前に個々の引数を再割り当てすることによって、
+引用符の間に空白を含めて渡すのが最も便利な方法なのですが、
+.Tn AT&T
+の
+.Xr troff
+のすべてのマクロを実装するには処理速度およ
+びメモリ使用量の点でかなり高価な方法となります。
+.Xr groff
+では高価な処理にはなりませんが、移植性のため、この方法は
+空白を含めることが最も必要である以下のマクロだけに限っています。
+.Pp
+.Bl -tag -width 4n -offset indent -compact
+.It Li \&Cd
+コンフィギュレーション宣言 (セクション 4 の
+.Sx SYNOPSIS )
+.It Li \&Bl
+リスト開始 (幅指定用)
+.It Li \&Em
+テキスト強調
+.It Li \&Fn
+関数 (セクション 2 と 4)
+.It Li \&It
+リストの項目
+.It Li \&Li
+リテラルテキスト
+.It Li \&Sy
+シンボリックテキスト
+.It Li \&%B
+書籍のタイトル
+.It Li \&%J
+定期刊行物のタイトル
+.It Li \&%O
+参照の追加的な注釈
+.It Li \&%R
+報告書のタイトル (参照の中で)
+.It Li \&%T
+書籍や定期刊行物の中の記事のタイトル
+.El
+.Pp
+空白を含む文字列を渡すのに、固定空白、すなわち詰め込まれない
+空白文字
+.Ql \e\
+を使う方法があります。
+すなわち、空白の前にエスケープ文字
+.Ql \e
+を指定する方法です。
+この方法はどのマクロでも使うことができますが、1 行を越える長さの
+テキストの調整の邪魔になるという副作用があります。
+.Xr Troff
+では
+固定空白は他の印刷可能文字と同様に扱われ、通常期待されるように、
+そこで文字列を空白や改行で分けることを行なわなくなります。
+この方法は文字列が行の境界をまたがないであろう場合に有用です。
+例えば、
+.Bl -tag -width "fetch(char *str)" -offset indent
+.It Fn fetch char\ *str
+は
+.Ql \&.Fn fetch char\e *str
+によって生成される
+.It Fn fetch "char *str"
+は
+.Ql \&.Fn fetch "\*qchar *str\*q"
+でも生成される
+.El
+.Pp
+もし
+.Ql \e
+や引用符が省かれると、
+.Ql \&.Fn
+は引数を 3 つ取り、
+その結果は以下のようになります。
+.Pp
+.Dl Fn fetch char *str
+.Pp
+パラメータのリストが改行の境界をまたぐ場合に何がおこるかについては、
+.Sx バグ
+のセクションを参照してください。
+.Ss 行末の空白文字
+.Xr Troff
+は行末に空白文字があると混乱してしまうことがあります。
+<空白> <行末> の文字シーケンスからすべての
+空白文字を取り除くのは良い予防策です。
+どうしても行末に空白文字をおく必要性が出てきた場合は、
+詰め込まれない空白とエスケープ文字
+.Ql \e&
+を
+使用することによって対応できます。
+例えば、
+.Ql string\e\ \e&
+のようにします。
+.Ss 特殊文字のエスケープ
+改行
+.Ql \en
+のような特殊文字は
+.Ql \e
+を
+.Ql \ee
+で置き換える
+(すなわち
+.Ql \een
+とする) ことによって、
+バックスラッシュを残して扱うことができます。
+.Sh MAN ページの分析
+man ページの本文はファイル
+.Pa /usr/share/misc/mdoc.template
+の基本テンプレートを使って容易に作り上げることができます。
+.Pa /usr/share/examples/mdoc
+にはいくつかのサンプルの man ページが収められています。
+.Pp
+.Ss マニュアルページのテンプレート
+.Bd -literal -offset indent
+\&.\e" 以下の項目はすべての man ページで必要な項目です。
+\&.Dd 月 日, 年
+\&.Os オペレーティングシステム [バージョン/リリース]
+\&.Dt ドキュメントタイトル [セクション番号] [ボリューム]
+\&.Sh NAME
+\&.Nm 名前
+\&.Nd 名前の 1 行での説明
+\&.Sh SYNOPSIS
+\&.Sh DESCRIPTION
+\&.\e" 以下の項目については、必要に応じてコメントをはずして
+\&.\e" 使用してください。
+\&.\e" この次の項目はセクション 2, 3, 9 でのみ必要な、関数の
+\&.\e" 戻り値です。
+\&.\e" .Sh RETURN VALUE
+\&.\e" 次の項目はセクション 1, 6, 7, 8, 9 でのみ必要なものです。
+\&.\e" .Sh ENVIRONMENT
+\&.\e" .Sh FILES
+\&.\e" .Sh EXAMPLES
+\&.\e" 次の項目はセクション 1, 6, 7, 8, 9 でのみ必要なものです。
+\&.\e" ((シェルへの) コマンドの戻り値と
+\&.\e" fprintf/stderr の型の診断です。)
+\&.\e" .Sh DIAGNOSTICS
+\&.\e" 次の項目はセクション 2, 3, 9 でのみ必要な、
+\&.\e" エラーハンドリングとシグナルハンドリングです。
+\&.\e" .Sh ERRORS
+\&.\e" .Sh SEE ALSO
+\&.\e" .Sh CONFORMING TO
+\&.\e" .Sh HISTORY
+\&.\e" .Sh AUTHORS
+\&.\e" .Sh BUGS
+.Ed
+.Pp
+このテンプレートにおける最初の項目はマクロ
+.Pq Li \&.Dd , \&.Os , \&.Dt
+であり、それぞれドキュメントの日付、
+man ページもしくは題材となっているソースの開発や変更のベースとなった
+オペレーティングシステム、
+.Pq Em 大文字で
+man ページタイトルをそのページが属するマニュアルの
+セクション番号とともに指定したもの、となっています。
+これらのマクロはそのページを識別するものであり、
+後述の
+.Sx タイトルマクロ
+で議論されています。
+.Pp
+テンプレート中の残りの項目はセクションのヘッダ
+.Pq Li \&.Sh
+であり、
+それらのうち
+.Sx NAME
+と
+.Sx SYNOPSIS
+と
+.Sx DESCRIPTION
+は必須項目です。
+これらのヘッダについては
+.Sx マニュアル領域
+を説明した後、
+.Sx ページ構造領域
+で議論されます。
+いくつかのコンテントマクロはページレイアウトマクロの説明に
+使われていますので、ページレイアウトマクロの前にコンテントマクロについて
+読むことを推奨します。
+.Sh タイトルマクロ
+タイトルマクロはページ構造領域の最初の部分ですが、man ページを
+前日に書き始めたいという人のために、最初に分けて記述されます。
+3 つのヘッダマクロでドキュメントか man ページのタイトル、
+オペレーティングシステム、および原著の日付を指定します。
+これらのマクロはドキュメントの最初に一度だけ呼び出されるもので、
+ヘッダとフッタを構成するためだけに使用されます。
+.Bl -tag -width 6n
+.It Li \&.Dt ドキュメントタイトル セクション番号 [ボリューム]
+.\" .Cl
+.\" USD UNIX User's Supplementary Documents
+.\" .Cl
+.\" PS1 UNIX Programmer's Supplementary Documents
+ドキュメントタイトルは man ページの主題であり、troff の制限により
+.Tn 大文字
+でなければいけません。
+セクション番号は 1,\ ...,\ 8 となり、これが指定されると
+ボリュームタイトルを省略してもかまいません。
+では、次のセクション番号と解説について後述します:
+ボリュームタイトルには任意のものか次のいずれかを指定します。
+.Pp
+.Bl -column SMM -offset indent -compact
+.It Li "AMD UNIX" Ancestral Manual Documents
+.It Li "SMM UNIX" System Manager's Manual
+.It Li "URM UNIX" Reference Manual
+.It Li "PRM UNIX" Programmer's Manual
+.El
+.Pp
+.\" .Cl
+.\" MMI UNIX Manual Master Index
+.\" .Cl
+.\" CON UNIX Contributed Software Manual
+.\" .Cl
+.\" LOC UNIX Local Manual
+デフォルトのボリュームラベルは
+セクション 1, 6, 7 では
+.Li URM
+、
+セクション 8 では
+.Li SMM
+、
+セクション 2, 3, 4, 5 では
+.Li PRM
+となっています。
+.It Li \&.Os オペレーティングシステム リリース番号
+オペレーティングシステムの名称には一般的な頭字語 (略称)
+を使わなければなりません。
+例えば、
+.Tn BSD
+や
+.Tn FreeBSD
+や
+.Tn ATT
+といったものです。
+リリース番号は、例えば4.3, 4.3+Tahoe, V.3, V.4 というような各システム
+での標準のリリースの命名法を使用します。
+認識されない引数はページのフッタ中に記述された通りに表示されます。
+以下にフッタの典型的な例を示します。
+.Pp
+.Dl \&.Os 4.3BSD
+.Pp
+や
+.Dl \&.Os FreeBSD 2.2
+.Pp
+やローカルで生成されたセット
+.Pp
+.Dl \&.Os CS Department
+.Pp
+Berkeley でのデフォルトである、引数なしの
+.Ql \&.Os
+はサイト固有の
+ファイル
+.Pa /usr/share/tmac/mdoc/doc-common
+において
+.Tn BSD
+として定義されています。
+これは実際には
+.Tn LOCAL
+として定義すべきです。
+.Ql \&.Os
+マクロがない場合は、ページの左下角は見にくくなるであろうことに
+注意してください。
+.It Li \&.Dd 月 日, 年
+日付は次のようにフォーマルな形式で記述しなければなりません。
+.Pp
+.ne 5
+.Dl January 25, 1989
+.El
+.Sh マニュアルと一般テキスト領域の紹介
+.Ss この名前には何が...?
+マニュアル領域のマクロ名はコマンドやサブルーチン、それに関連ファイルを
+説明するために使われている日常のインフォーマルな言葉から取られています。
+この言葉と少し違うバリエーションのものが man ページを書く上での
+3 つの異なった面を記述するのに使われます。
+最初のものは
+.Nm \-mdoc
+マクロ使用方法の説明です。
+2 番目のものは
+.Nm \-mdoc
+マクロを用いた
+.Ux
+コマンドの記述です。
+3 番目はコマンドを通常の言葉の感覚でユーザに示したものです。
+これはすなわち、man ページのテキスト中でのコマンドの議論となります。
+.Pp
+最初のケースでは、
+.Xr troff 1
+マクロはそれ自身、
+一種のコマンドとなっています。
+troff コマンドは一般的に以下のような形式をとります。
+.Bd -filled -offset indent
+\&.Va argument1 argument2 ... argument9
+.Ed
+.Pp
+.Ql \&.Va
+はマクロコマンドもしくは要求を示しており、
+それに続くものはすべて引数として処理されます。
+2 番目のケースでは、コンテントマクロを使用する
+.Ux
+コマンドの記述がもう少し含まれます。
+典型的な
+.Sx SYNOPSIS
+コマンド行はこのように表示されます。
+.Bd -filled -offset indent
+.Nm filter
+.Op Fl flag
+.Ar infile outfile
+.Ed
+.Pp
+ここで
+.Nm filter
+はコマンド名であり、
+角括弧で囲まれた文字列
+.Fl flag
+は
+.Em フラグ
+引数で、
+これは角括弧で囲むことによってオプションであることを示しています。
+.Nm \-mdoc
+の用語では
+.Ar infile
+と
+.Ar outfile
+は
+.Em 引数
+と称されています。
+上の例のフォーマットを行なったマクロは以下のものです。
+.Bd -literal -offset indent
+\&.Nm filter
+\&.Op \&Fl flag
+\&.Ar infile outfile
+.Ed
+.Pp
+3 番目のケースでは、コマンドの説明や構文に上記の例の両方が使われ、
+さらに細かい記述が追加されるでしょう。
+上の例での引数
+.Ar infile
+と
+.Ar outfile
+は
+.Em オペランド
+もしくは
+.Em ファイル引数
+として参照されます。
+コマンド行の引数のリストはかなり長くなる場合もあります。
+.Bl -tag -width make -offset indent
+.It Nm make
+.Op Fl eiknqrstv
+.Op Fl D Ar variable
+.Op Fl d Ar flags
+.Op Fl f Ar makefile
+.Bk -words
+.Op Fl I Ar directory
+.Ek
+.Op Fl j Ar max_jobs
+.Op Ar variable=value
+.Bk -words
+.Op Ar target ...
+.Ek
+.El
+.Pp
+ここではコマンド
+.Nm make
+について記述しており、
+.Ar makefile
+をフラグ
+.Fl f
+の引数としています。またオプションの
+ファイルオペランド
+.Ar target
+についても議論しています。
+言葉での説明では、こういった詳細な記述が混乱を防いでくれますが、
+.Nm \-mdoc
+パッケージにはフラグ
+.Em への
+引数のための
+マクロがありません。その代わりに
+.Ar target
+のような
+オペランドやファイル引数に使われる引数マクロ
+.Ql \&Ar
+が
+.Ar variable
+のようなフラグへの引数にも使われます。
+この make コマンド行は以下の指定により生成されています。
+.Bd -literal -offset indent
+\&.Nm make
+\&.Op Fl eiknqrstv
+\&.Op Fl D Ar variable
+\&.Op Fl d Ar flags
+\&.Op Fl f Ar makefile
+\&.Op Fl I Ar directory
+\&.Op Fl j Ar max_jobs
+\&.Op Ar variable=value
+\&.Bk -words
+\&.Op Ar target ...
+\&.Ek
+.Ed
+.Pp
+マクロ
+.Ql \&.Bk
+と
+.Ql \&.Ek
+は
+.Sx キープ
+セクションにおいて解説されています。
+.Ss 一般的な構文
+マニュアル領域と一般テキスト領域のマクロはいくつかの小さな違い
+があるものの、同様な構文を使用しています。
+.Ql \&.Ar ,
+.Ql \&.Fl ,
+.Ql \&.Nm ,
+.Ql \&.Pa
+は引数なしで呼び出された時のみ異なります。
+.Ql \&.Fn
+と
+.Ql \&.Xr
+は引数のリストの順番が異なります。
+マクロ
+.Ql \&.Op
+と
+.Ql \&.Fn
+には入れ子の制限があります。
+すべてのコンテントマクロが句読点を認識し、正しく扱うには、
+各々の句読点文字が先行する空白で分離されている必要があります。
+以下のように指定されている場合、
+.Pp
+.Dl \&.Li sptr, ptr),
+.Pp
+結果は以下のようになります。
+.Pp
+.Dl Li sptr, ptr),
+.Pp
+ここでは句読点は認識されずすべての出力はリテラルなフォントで行なわれて
+います。句読点が空白文字で区切られている場合、
+.Pp
+.Dl \&.Li "sptr , ptr ) ,"
+.Pp
+結果は以下のようになります。
+.Pp
+.Dl Li sptr , ptr ) ,
+.Pp
+今度は句読点が認識され、出力はデフォルトのフォントで行なわれ
+リテラルフォントの文字列と区別されています。
+.Pp
+.Ql \e&
+でエスケープすることによって句読点文字の特別な意味を
+取り除くことができます。
+.Xr troff
+はマクロ言語としての限界から、
+数学、論理学、もしくは以下の引用符の集合のメンバを含んだ文字列を
+表現するのは困難です。
+.Bd -literal -offset indent-two
+\&{+,\-,/,*,\&%,<,>,<=,>=,=,==,&,`,',"}
+.Ed
+.Pp
+.Xr troff
+が文字によって示唆されている操作もしくは評価を実際に
+行なっていることが、その問題の原因となっています。
+.Ql \e&
+でこれらをエスケープすることによって、
+これらの文字が予期せずに評価されることを防止することができます。
+最初のコンテントマクロは、以下の
+.Ql \&.Ad
+において、
+その典型的な構文が示されています。
+.Sh マニュアル領域
+.Ss アドレスマクロ
+アドレスマクロは addr1[,addr2[,addr3]] の形式からなる
+アドレスを識別します。
+.Pp
+.Dl 使い方: .Ad address ... \*(Pu
+.Bl -tag -width ".Ad f1 , f2 , f3 :" -compact -offset 14n
+.It Li \&.Ad addr1
+.Ad addr1
+.It Li \&.Ad addr1\ .
+.Ad addr1 .
+.It Li \&.Ad addr1\ , file2
+.Ad addr1 , file2
+.It Li \&.Ad f1\ , f2\ , f3\ :
+.Ad f1 , f2 , f3 :
+.It Li \&.Ad addr\ )\ )\ ,
+.Ad addr ) ),
+.El
+.Pp
+.Ql \&.Ad
+を引数なしで呼び出すのはエラーです。
+.Ql \&.Ad
+は他のマクロから呼び出し可能で解析されます。
+.Ss 作者名
+.Ql \&.An
+マクロは文書化されている項目の作者の名前、もしくは実際の
+マニュアルページの作者の名前を指定するために使われます。
+名前の情報の後のすべての引数は句読点として扱われます。
+.Pp
+.Dl 使い方: .An author_name \*(Pu
+.Bl -tag -width ".An Joe Author ) ) ," -compact -offset 14n
+.It Li \&.An Joe\ Author
+.An Joe Author
+.It Li \&.An Joe\ Author\ ,
+.An Joe\ Author ,
+.It Li \&.An Joe\ Author\ \&Aq\ nobody@FreeBSD.ORG
+.An Joe Author Aq nobody@FreeBSD.ORG
+.It Li \&.An Joe\ Author\ )\ )\ ,
+.An Joe Author ) ),
+.El
+.Pp
+.Ql \&.An
+マクロは解析され、呼び出し可能です。
+.Ql \&.An
+を引数なしで呼び出すのはエラーです。
+.Ss 引数マクロ
+引数マクロ
+.Ql \&.Ar
+はコマンド行の引数を参照する際に
+使用することができます。
+.Pp
+.Dl 使い方: .Ar argument ... \*(Pu
+.Bl -tag -width ".Ar file1 file2" -compact -offset 15n
+.It Li \&.Ar
+.Ar
+.It Li \&.Ar file1
+.Ar file1
+.It Li \&.Ar file1\ .
+.Ar file1 .
+.It Li \&.Ar file1 file2
+.Ar file1 file2
+.It Li \&.Ar f1 f2 f3\ :
+.Ar f1 f2 f3 :
+.It Li \&.Ar file\ )\ )\ ,
+.Ar file ) ),
+.El
+.Pp
+.Ql \&.Ar
+が引数なしで呼び出されると、
+.Ql Ar
+として扱われます。
+.Ql \&.Ar
+マクロは解析され、呼び出し可能です。
+.Ss コンフィギュレーション宣言 (セクション 4 のみ)
+.Ql \&.Cd
+マクロはセクション 4 のマニュアルにおいて、
+デバイスインタフェースの
+.Xr config 8
+による宣言の説明に使われます。
+このマクロは引用符 (二重引用符のみ) で囲まれた引数を取ることができます。
+.Pp
+.Bl -tag -width "device le0 at scode?" -offset indent
+.It Cd "device le0 at scode?"
+は
+.Ql ".Cd device le0 at scode?"
+によって生成されます。
+.El
+.Ss コマンド修飾子
+コマンド修飾子は
+.Ql \&.Cm
+マクロがすべての引数の前にダッシュ文字を
+付けないことを除いて、
+.Ql \&.Fl
+(フラグ) コマンドと同じです。
+伝統的にフラグはダッシュ文字に引き続いて指定されますが、
+いくつかのコマンドやコマンドのサブセットはこの方法を使っていません。
+コマンド修飾子はエディタコマンドのような対話的なコマンドでも
+指定されることがあります。
+.Sx フラグ
+のセクションを参照してください。
+.Ss 定義済みの変数
+インクルードファイルにおいて定義されている変数は
+.Ql \&.Dv
+マクロによって指定します。
+.Pp
+.Dl 使い方: .Dv defined_variable ... \*(Pu
+.Bl -tag -width ".Dv MAXHOSTNAMELEN" -compact -offset 14n
+.It Li ".Dv MAXHOSTNAMELEN"
+.Dv MAXHOSTNAMELEN
+.It Li ".Dv TIOCGPGRP )"
+.Dv TIOCGPGRP )
+.El
+.Pp
+.Ql \&.Dv
+を引数なしで呼び出すのはエラーです。
+.Ql \&.Dv
+は解析され、呼び出し可能です。
+.Ss errno (セクション 2 のみ)
+エラーマクロ
+.Ql \&.Er
+はセクション 2 のライブラリルーチンにおける
+エラーの戻り値を指定します。
+下記の 2 番目の例では
+.Ql \&.Er
+は一般テキスト領域マクロである
+.Ql \&.Bq
+(これはセクション 2 のマニュアルページで使われています)
+と共に使われています。
+.Pp
+.Dl 使い方: .Er ERRNOTYPE ... \*(Pu
+.Bl -tag -width ".Bq Er ENOTDIR" -compact -offset 14n
+.It Li \&.Er ENOENT
+.Er ENOENT
+.It Li \&.Er ENOENT\ )\ ;
+.Er ENOENT ) ;
+.It Li \&.Bq \&Er ENOTDIR
+.Bq Er ENOTDIR
+.El
+.Pp
+.Ql \&.Er
+を引数なしで呼び出すのはエラーです。
+.Ql \&.Er
+は解析され、呼び出し可能です。
+.Ss 環境変数
+.Ql \&.Ev
+マクロは環境変数を指定します。
+.Pp
+.Dl 使い方: .Ev argument ... \*(Pu
+.Bl -tag -width ".Ev PRINTER ) ) ," -compact -offset 14n
+.It Li \&.Ev DISPLAY
+.Ev DISPLAY
+.It Li \&.Ev PATH\ .
+.Ev PATH .
+.It Li \&.Ev PRINTER\ )\ )\ ,
+.Ev PRINTER ) ),
+.El
+.Pp
+.Ql \&.Ev
+を引数なしで呼び出すのはエラーです。
+.Ql \&.Ev
+は解析され、呼び出し可能です。
+.Ss 関数の引数
+.Ql \&.Fa
+マクロは関数の引数 (パラメータ) を
+マニュアルの
+.Sx SYNOPSIS
+のセクション外、
+もしくは
+.Sx SYNOPSIS
+のセクション内で参照する場合に使われます。
+パラメータのリストが
+.Ql \&.Fn
+マクロでは長すぎる場合は、
+囲って使うマクロ
+.Ql \&.Fo
+と
+.Ql \&.Fc
+を使わなければなりません。
+.Ql \&.Fa
+は構造体のメンバを参照する場合にも使われます。
+.Pp
+.Dl 使い方: .Fa function_argument ... \*(Pu
+.Bl -tag -width ".Fa d_namlen\ )\ )\ ," -compact -offset 14n
+.It Li \&.Fa d_namlen\ )\ )\ ,
+.Fa d_namlen ) ),
+.It Li \&.Fa iov_len
+.Fa iov_len
+.El
+.Pp
+.Ql \&.Fa
+を引数なしで呼び出すのはエラーです。
+.Ql \&.Fa
+は解析され、呼び出し可能です。
+.Ss 関数の宣言
+.Ql \&.Fd
+マクロは
+.Sx SYNOPSIS
+セクションにおいて、
+セクション 2 または 3 の関数の説明で使われます。
+.Ql \&.Fd
+マクロから他のマクロを呼び出すことはなく、
+他のマクロから呼び出すこともできません。
+.Pp
+.Dl 使い方: .Fd include_file (or defined variable)
+.Pp
+.Sx SYNOPSIS
+セクションにおいて、関数がすでに示されていて改行が
+入っていない場合、
+.Ql \&.Fd
+によって改行が挿入されます。これによって
+前の関数呼び出しと次の関数の宣言の間に最適な行間が設定されます。
+.Ss フラグ
+.Ql \&.Fl
+マクロはコマンド行のフラグを扱います。
+フラグの前にはダッシュ
+.Ql \-
+が挿入されます。
+対話的なコマンドのフラグでは、ダッシュがフラグの前には挿入されませんが、
+.Ql \&.Cm
+(コマンド修飾子) マクロは、ダッシュを付けないことを除き、
+同じ働きをします。
+.Pp
+.Dl 使い方: .Fl argument ... \*(Pu
+.Bl -tag -width ".Fl \-s \-t \-v" -compact -offset 14n
+.It Li \&.Fl
+.Fl
+.It Li \&.Fl cfv
+.Fl cfv
+.It Li \&.Fl cfv\ .
+.Fl cfv .
+.It Li \&.Fl s v t
+.Fl s v t
+.It Li \&.Fl -\ ,
+.Fl - ,
+.It Li \&.Fl xyz\ )\ ,
+.Fl xyz ) ,
+.El
+.Pp
+引数なしで
+.Ql \&.Fl
+マクロを指定すると、
+標準入力/標準出力を意味するダッシュとなります。
+ひとつのダッシュに
+.Ql \&.Fl
+マクロを使用すると、
+2 つダッシュとなることに注意して下さい。
+.Ql \&.Fl
+マクロは解析され、呼び出し可能です。
+.Ss 関数 (ライブラリルーチン)
+.Ql \&.Fn
+マクロは ANSI C の記法を規範としています。
+.Bd -literal
+使い方: .Fn [type] function [[type] parameters ... \*(Pu]
+.Ed
+.Bl -tag -width ".Fn _int align_ _const * char *sptrsxx" -compact
+.It Li "\&.Fn getchar"
+.Fn getchar
+.It Li "\&.Fn strlen ) ,"
+.Fn strlen ) ,
+.It Li \&.Fn "\*qint align\*q" "\*qconst * char *sptrs\*q" ,
+.Fn "int align" "const * char *sptrs" ,
+.El
+.Pp
+.Ql \&.Fn
+を引数を指定せずに呼び出すのはエラーです。
+.Ql \&.Fn
+マクロは解析され、呼び出し可能です。
+他のマクロの呼び出しは
+.Ql \&.Fn
+の呼び出しの終了を意味することに
+注意して下さい (閉じ括弧がその点で挿入されます)。
+.Pp
+9 個以上のパラメータをとる関数 (これは滅多にないことですが) では、
+.Ql \&.Fo
+マクロ (関数オープン) と
+.Ql \&.Fc
+マクロ
+(関数クローズ) を
+.Ql \&.Fa
+(関数引数) と共に使って、
+この制限を回避することができます。
+以下にその例を示します。
+.Bd -literal -offset indent
+\&.Fo "int res_mkquery"
+\&.Fa "int op"
+\&.Fa "char *dname"
+\&.Fa "int class"
+\&.Fa "int type"
+\&.Fa "char *data"
+\&.Fa "int datalen"
+\&.Fa "struct rrec *newrr"
+\&.Fa "char *buf"
+\&.Fa "int buflen"
+\&.Fc
+.Ed
+.Pp
+これは以下のような結果になります。
+.Bd -filled -offset indent
+.Fo "int res_mkquery"
+.Fa "int op"
+.Fa "char *dname"
+.Fa "int class"
+.Fa "int type"
+.Fa "char *data"
+.Fa "int datalen"
+.Fa "struct rrec *newrr"
+.Fa "char *buf"
+.Fa "int buflen"
+.Fc
+.Ed
+.Pp
+.Ql \&.Fo
+と
+.Ql \&.Fc
+マクロは解析され、呼び出し可能です。
+.Sx SYNOPSIS
+セクションでは、関数は常に行の先頭から開始されます。
+.Sx SYNOPSIS
+セクションにおいて、複数の関数が示されており、
+関数の型が示されない場合、改行が挿入され、現在の関数名とその前の関数名
+の間に最適な改行量が設定されます。現在、
+.Ql \&.Fn
+は troff の行の長さ
+に対して、語の境界をチェックしておらず、予期しない場所で改行が挿入され
+てしまうことがあります。これは近い将来修正されるでしょう。
+.Ss 関数の型
+このマクロは
+.Sx SYNOPSIS
+セクションで使うものです。
+man ページ中の他の場所でも問題なく使うことができますが、
+セクション 2 と 3 の
+.Sx SYNOPSIS
+セクションでカーネルの通常の形式で
+関数の型を示すことがこのマクロの目的です (このマクロは関数名が次の行に
+置かれるように改行を挿入します)。
+.Pp
+.Dl 使い方: .Ft type ... \*(Pu
+.Bl -tag -width "\&.Ft struct stat" -offset 14n -compact
+.It Li \&.Ft struct stat
+.Ft struct stat
+.El
+.Pp
+.Ql \&.Ft
+は他のマクロからは呼び出せません。
+.Ss 対話的なコマンド
+.Ql \&.Ic
+マクロは対話的なコマンド、もしくは内部コマンドを指定します。
+.Pp
+.Dl 使い方: .Ic argument ... \*(Pu
+.Bl -tag -width ".Ic setenv , unsetenvxx" -compact -offset 14n
+.It Li \&.Ic :wq
+.Ic :wq
+.It Li \&.Ic do while {...}
+.Ic do while {...}
+.It Li \&.Ic setenv\ , unsetenv
+.Ic setenv , unsetenv
+.El
+.Pp
+.Ql \&.Ic
+を引数なしで呼び出すのはエラーです。
+.Ql \&.Ic
+マクロは解析され、呼び出し可能です。
+.Ss 名前マクロ
+.Ql \&.Nm
+マクロは文書のタイトルやサブジェクト名を指定するために
+使われます。このマクロは最初に呼び出された時の引数を覚えておくという
+特性を持っており、それは常にそのページのサブジェクト名であるべきです。
+引数なしで呼び出されると
+.Ql \&.Nm
+は作者の作業を少なくするためだけの
+目的で、最初の名称を出力します。注意: セクション 2 または 3 のドキュメント
+の関数名は
+.Sx NAME
+セクションにおいて
+.Ql \&.Nm
+で指定され、
+.Sx SYNOPSIS
+セクションや残りのセクションでは
+.Ql \&.Fn
+で指定され
+ます。
+.Xr csh 1
+での
+.Ql while
+コマンドのキーワードのような対話的
+なコマンドでは
+.Ql \&.Ic
+マクロを使うべきです。
+.Ql \&.Ic
+は
+ほとんど
+.Ql \&.Nm
+と同一ですが、それが最初に使われたときの引数を
+記憶することはできません。
+.Pp
+.Dl 使い方: .Nm argument ... \*(Pu
+.Bl -tag -width ".Nm mdoc.sample" -compact -offset 14n
+.It Li \&.Nm mdoc.sample
+.Nm mdoc.sample
+.It Li \&.Nm \e-mdoc
+.Nm \-mdoc .
+.It Li \&.Nm foo\ )\ )\ ,
+.Nm foo ) ),
+.It Li \&.Nm
+.Nm
+.El
+.Pp
+.Ql \&.Nm
+マクロは解析され、呼び出し可能です。
+.Ss オプション
+.Ql \&.Op
+マクロはコマンド行の残りのすべての引数をオプションである
+ことを示す角括弧で囲み、末尾の句読点は角括弧の外に置きます。
+.Ql \&.Oc
+マクロと
+.Ql \&.Oo
+マクロは複数行に渡って使うことが
+できます。
+.Pp
+.Dl 使い方: .Op options ... \*(Pu
+.Bl -tag -width ".Op Fl c Ar objfil Op Ar corfil ," -compact -offset indent
+.It Li \&.Op
+.Op
+.It Li ".Op Fl k"
+.Op Fl k
+.It Li ".Op Fl k ) ."
+.Op Fl k ) .
+.It Li ".Op Fl k Ar kookfile"
+.Op Fl k Ar kookfile
+.It Li ".Op Fl k Ar kookfile ,"
+.Op Fl k Ar kookfile ,
+.It Li ".Op Ar objfil Op Ar corfil"
+.Op Ar objfil Op Ar corfil
+.It Li ".Op Fl c Ar objfil Op Ar corfil ,"
+.Op Fl c Ar objfil Op Ar corfil ,
+.It Li \&.Op word1 word2
+.Op word1 word2
+.El
+.Pp
+.Ql \&.Oc
+マクロと
+.Ql \&.Oo
+マクロ:
+.Bd -literal -offset indent
+\&.Oo
+\&.Op \&Fl k \&Ar kilobytes
+\&.Op \&Fl i \&Ar interval
+\&.Op \&Fl c \&Ar count
+\&.Oc
+.Ed
+.Pp
+生成結果:
+.Oo
+.Op Fl k Ar kilobytes
+.Op Fl i Ar interval
+.Op Fl c Ar count
+.Oc
+.Pp
+.Ql \&.Op
+と
+.Ql \&.Oc
+と
+.Ql \&.Oo
+マクロは
+解析され、呼び出し可能です。
+.Ss パス名
+.Ql \&.Pa
+マクロはパス名もしくはファイル名をフォーマットします。
+.Pp
+.Dl 使い方: .Pa pathname \*(Pu
+.Bl -tag -width ".Pa /tmp/fooXXXXX ) ." -compact -offset 14n
+.It Li \&.Pa /usr/share
+.Pa /usr/share
+.It Li \&.Pa /tmp/fooXXXXX\ )\ .
+.Pa /tmp/fooXXXXX ) .
+.El
+.Pp
+.Ql \&.Pa
+マクロは解析され、呼び出し可能です。
+.Ss 変数
+一般的な変数への参照です。
+.Pp
+.Dl 使い方: .Va variable ... \*(Pu
+.Bl -tag -width ".Va char s ] ) ) ," -compact -offset 14n
+.It Li \&.Va count
+.Va count
+.It Li \&.Va settimer ,
+.Va settimer ,
+.It Li \&.Va int\ *prt\ )\ :
+.Va int\ *prt ) :
+.It Li \&.Va char\ s\ ]\ )\ )\ ,
+.Va char\ s ] )),
+.El
+.Pp
+.Ql \&.Va
+を引数なしで呼び出すのはエラーです。
+.Ql \&.Va
+マクロは解析され、呼び出し可能です。
+.Ss マニュアルページの相互参照
+.Ql \&.Xr
+マクロは最初の引数にマニュアルページの名称を取り、
+もしあれば次の引数にセクションのページ数か句読点を取ります。
+すべての残りの引数は句読点と見なされます。
+.Pp
+.Dl 使い方: .Xr man_page [1,...,8] \*(Pu
+.Bl -tag -width ".Xr mdoc 7 ) ) ," -compact -offset 14n
+.It Li \&.Xr mdoc
+.Xr mdoc
+.It Li \&.Xr mdoc\ ,
+.Xr mdoc ,
+.It Li \&.Xr mdoc 7
+.Xr mdoc 7
+.It Li \&.Xr mdoc 7\ )\ )\ ,
+.Xr mdoc 7 ) ),
+.El
+.Pp
+.Ql \&.Xr
+マクロは解析され、呼び出し可能です。
+.Ql \&.Xr
+を引数なしで呼び出すのはエラーです。
+.Sh 一般テキスト領域
+.Ss AT&T マクロ
+.Bd -literal -offset indent -compact
+使い方: .At [v6 | v7 | 32v | V.1 | V.4] ... \*(Pu
+.Ed
+.Bl -tag -width ".At v6 ) ," -compact -offset 14n
+.It Li .At
+.At
+.It Li ".At v6 ."
+.At v6 .
+.El
+.Pp
+.Ql \&.At
+マクロは解析
+.Em されず
+、呼び出し
+.Em 不可
+です。
+最大 2 つまでの引数を取ることができます。
+.Ss BSD マクロ
+.Dl 使い方: .Bx [Version/release] ... \*(Pu
+.Bl -tag -width ".Bx 4.3 ) ," -compact -offset 14n
+.It Li .Bx
+.Bx
+.It Li ".Bx 4.3 ."
+.Bx 4.3 .
+.El
+.Pp
+.Ql \&.Bx
+マクロは解析され、呼び出し可能です。
+.Ss FreeBSD マクロ
+.Bd -literal -offset indent -compact
+使い方: .Fx Version.release ... \*(Pu
+.Ed
+.Bl -tag -width ".Fx 2.2 ) ," -compact -offset 14n
+.It Li ".Fx 2.2 ."
+.Fx 2.2 .
+.El
+.Pp
+.Ql \&.Fx
+マクロは解析
+.Em されず
+、呼び出し
+.Em 不可
+です。
+最大 2 つまでの引数を取ることができます。
+.Ss UNIX マクロ
+.Dl 使い方: .Ux ... \*(Pu
+.Bl -tag -width ".Ux 4.3 ) ," -compact -offset 14n
+.It Li .Ux
+.Ux
+.El
+.Pp
+.Ql \&.Ux
+マクロは解析され、呼び出し可能です。
+.Ss 囲い/クォートマクロ
+囲いの概念はクォートと似たものです。
+1 つ以上の文字列が引用符や括弧のような文字のペアで囲まれている
+オブジェクトを指します。
+クォートと囲いという用語はこの文書を通して同じ意味で使われます。
+ほとんどの 1 行の囲いマクロはクォート (quote) のヒントとするために、
+小文字の
+.Ql q
+で終了しますが、いくつかの例外があります。
+各々の囲いマクロに対し、開始マクロと終了マクロのペアもあり、
+それぞれ小文字の
+.Ql o
+と
+.Ql c
+で終了します。
+これらは 1 行以上のテキストに渡って使うことができますが、
+入れ子にする場合に制限があります。
+その中では 1 行形式のクォートマクロのみ使用することができます。
+.Pp
+.ne 5
+.Bd -filled -offset indent
+.Bl -column "quote " "close " "open " "Enclose Stringx(in XX) " XXstringXX
+.Em "クォート 終了 開始 機能 結果"
+\&.Aq .Ac .Ao カギ括弧による囲い <文字列>
+\&.Bq .Bc .Bo 角括弧による囲い [文字列]
+\&.Dq .Dc .Do 二重引用符 ``文字列''
+ .Ec .Eo 囲い文字列 (XXによる) XX文字列XX
+\&.Pq .Pc .Po 括弧による囲い (文字列)
+\&.Ql クォートされたリテラル `st' or 文字列
+\&.Qq .Qc .Qo まっすぐな二重引用符 "文字列"
+\&.Sq .Sc .So 一重引用符 `文字列'
+.El
+.Ed
+.Pp
+下記の不正なマクロを除き、すべてのクォートマクロは解析され、呼び出し
+可能です。句読点がひとつずつ置かれていて、スペースで区切られていれば、
+すべてのクォートマクロは句読点を適切に扱います。クォートマクロは開く
+句読点、閉じる句読点(訳注: 句読点には括弧なども含みます) を調べ、
+それが囲む文字列より前か後かを決めます。これによって、ある程度の入れ子
+が可能になっています。
+.Bl -tag -width xxx,xxxx
+.It Li \&.Ec , \&.Eo
+これらのマクロは各々開始および終了の文字列を最初の引数に取ります。
+.It Li \&.Ql
+リテラルをクォートするマクロは
+.Xr troff
+では
+.Xr nroff
+と異なっ
+た処理を行ないます。
+.Xr nroff
+でフォーマットされた場合、クォート指定
+されたリテラルは常にクォートされます。
+.Xr troff
+でフォーマットされた
+場合は、アイテムの幅が固定幅文字 3 つ分より狭い場合にのみクォートされま
+す。これはリテラル (固定幅) のフォントの変更があまり気づかれないもので
+あるため、短い文字列を良く見えるようにするためです。
+.It Li \&.Pf
+プレフィックスマクロは呼び出し可能ではありませんが、解析されます。
+.Bl -tag -width (namexx -offset indent
+.It Li ".Pf ( Fa name2"
+は
+.Pf ( Fa name2
+となります。
+.El
+.Pp
+.Ql \&.Ns
+(空白なし) マクロはサフィックス機能と同様の作用があります。
+.El
+.Pp
+.ne 4
+クォートの例:
+.Bl -tag -width ".Aq Pa ctype.h ) ,xxxxxxxx" -compact -offset indent
+.It Li \&.Aq
+.Aq
+.It Li \&.Aq \&Ar ctype.h\ )\ ,
+.Aq Ar ctype.h ) ,
+.It Li \&.Bq
+.Bq
+.It Li \&.Bq \&Em Greek \&, French \&.
+.Bq Em Greek , French .
+.It Li \&.Dq
+.Dq
+.It Li ".Dq string abc ."
+.Dq string abc .
+.It Li ".Dq \'^[A-Z]\'"
+.Dq \'^[A-Z]\'
+.It Li "\&.Ql man mdoc"
+.Ql man mdoc
+.It Li \&.Qq
+.Qq
+.It Li "\&.Qq string ) ,"
+.Qq string ) ,
+.It Li "\&.Qq string Ns ),"
+.Qq string Ns ),
+.It Li \&.Sq
+.Sq
+.It Li "\&.Sq string"
+.Sq string
+.El
+.Pp
+囲いマクロの入れ子についての良い例については、
+オプションマクロ
+.Ql \&.Op
+を参照してください。
+このマクロは上でリストされているような囲いマクロと同じベースの上に
+作られています。
+拡張引数リストマクロ
+.Ql \&.Xo
+と
+.Ql \&.Xc
+もまた同じルーチンを
+ベースに作られており、
+.Nm \-mdoc
+マクロの使い方の非常に良い例と
+なっています。
+.Ss no\-op もしくは通常テキストマクロ
+.Ql \&.No
+マクロはマクロコマンド行において、コンテントマクロの構文
+形式に従うが、フォーマットされては
+.Em ならない
+単語をハックする
+ものです。
+.Ss 空白なしマクロ
+.Ql \&.Ns
+マクロはマクロ間での不要な空白を除去します。
+これはフラグと引数の間に空白を含まない古いスタイルの引数リストを使う
+場合に便利です。
+.Bl -tag -width ".Op Fl I Ns Ar directoryxx" -offset indent
+.It Li ".Op Fl I Ns Ar directory"
+は
+.Op Fl I Ns Ar directory
+という結果になります。
+.El
+.Pp
+注:
+.Ql \&.Ns
+マクロは他のマクロ名が続かなければ、
+スペースを除去したあとに
+.Ql \&.No
+マクロを常に起動します。
+.Ql \&.Ns
+マクロは解析され、呼び出し可能です。
+.Ss セクションの相互参照
+.Ql \&.Sx
+マクロは同一文書内でのセクションのヘッダへの参照を
+指定します。これは解析され、呼び出し可能です。
+.Pp
+.Bl -tag -width "Li \&.Sx FILES" -offset 14n
+.It Li \&.Sx FILES
+.Sx FILES
+.El
+.Ss 相互参照と引用
+以下のマクロは多少なりとも参考文献を扱えるようにと意図したものです。
+これらのマクロは、せいぜい参照スタイルの参考文献のサブセットを手動で
+作成しやすくする程度です。
+.Pp
+.Bl -tag -width 6n -offset indent -compact
+.It Li .Rs
+参考文献の開始。
+改行を挿入してから、参考文献の終了マクロが読み込まれるまで
+参考文献の情報を収集する。
+.It Li .Re
+参考文献の終了。参考文献が表示される。
+.It Li .%A
+参考文献の作者名。1 回の呼び出しにつき、作者名をひとつ指定する。
+.It Li .%B
+書籍のタイトル。
+.It Li .\&%C
+都市/場所。
+.It Li .\&%D
+日付。
+.It Li .%J
+定期刊行物の名称。
+.It Li .%N
+発行番号。
+.It Li .%O
+追加の情報。
+.It Li .%P
+ページ番号。
+.It Li .%R
+報告書の名称。
+.It Li .%T
+記事のタイトル。
+.It Li .%V
+巻数。
+.El
+.Pp
+.Ql %
+で始まるマクロは呼び出し不可能ですが、
+呼び出し側に戻る商標名マクロだけは解析されます。
+(現時点では予期できないことです。)
+商標名のみ解析されるのは
+.Xr troff Ns / Ns Xr ditroff
+の出力を
+きれいにするためです。
+.Ss 返り値
+.Ql \&.Rv
+マクロは
+.Sx RETURN VALUE
+のセクション
+で使うテキストを生成します。
+.Pp
+.Dl 使い方: .Rv [-std function]
+.Pp
+.Ql \&.Rv -std atexit
+は以下のテキストを生成します。
+.Pp
+.\" fake chapter 3 to avoid error message from Rv
+.ds cH 3
+.\" and back to 7 again
+.Rv -std atexit
+.ds cH 7
+.Pp
+.Fl std
+オプションはセクション 2 と 3 のマニュアルページでのみ有効です。
+.Ss 商標名 (頭文字とタイプ名)
+商標名マクロは一般的に長さが 2 文字を越えるすべてが大文字の単語用に
+使われる小さな大文字のマクロです。
+.Pp
+.Dl 使い方: .Tn symbol ... \*(Pu
+.Bl -tag -width ".Tn ASCII" -compact -offset 14n
+.It Li \&.Tn DEC
+.Tn DEC
+.It Li \&.Tn ASCII
+.Tn ASCII
+.El
+.Pp
+.Ql \&.Tn
+マクロは解析され、他のマクロから呼び出し可能です。
+.Ss 拡張引数
+.Ql \&.Xo
+と
+.Ql \&.Xc
+マクロでマクロの境界における引数リストを
+拡張することができます。引数リストは
+.Ql \&.Op
+のようなすべての引数
+が 1 行中に指定されていることを前提としているマクロの中では行に渡って
+拡張することができません。
+.Pp
+以下に空白モードマクロをスペーシングをオフにするために
+使った
+.Ql \&.Xo
+での例を示します。
+.Bd -literal -offset indent
+\&.Sm off
+\&.It Xo Sy I Ar operation
+\&.No \een Ar count No \een
+\&.Xc
+\&.Sm on
+.Ed
+.Pp
+これは以下のような結果になります。
+.Bd -filled -offset indent
+.Bl -tag -width flag -compact
+.Sm off
+.It Xo Sy I Ar operation
+.No \en Ar count No \en
+.Xc
+.Sm on
+.El
+.Ed
+.Pp
+例をもうひとつ:
+.Bd -literal -offset indent
+\&.Sm off
+\&.It Cm S No \&/ Ar old_pattern Xo
+\&.No \&/ Ar new_pattern
+\&.No \&/ Op Cm g
+\&.Xc
+\&.Sm on
+.Ed
+.Pp
+これは以下のような結果になります。
+.Bd -filled -offset indent
+.Bl -tag -width flag -compact
+.Sm off
+.It Cm S No \&/ Ar old_pattern Xo
+.No \&/ Ar new_pattern
+.No \&/ Op Cm g
+.Xc
+.Sm on
+.El
+.Ed
+.Pp
+囲いマクロを使った
+.Ql \&.Xo
+の他の例:
+変数の値をテストして下さい。
+.Bd -literal -offset indent
+\&.It Xo
+\&.Ic .ifndef
+\&.Oo \e&! Oc Ns Ar variable
+\&.Op Ar operator variable ...
+\&.Xc
+.Ed
+.Pp
+これは以下のような結果になります。
+.Bd -filled -offset indent
+.Bl -tag -width flag -compact
+.It Xo
+.Ic .ifndef
+.Oo \&! Oc Ns Ar variable
+.Op Ar operator variable ...
+.Xc
+.El
+.Ed
+.Pp
+上のすべての例では
+.Ql \&.It
+(リスト項目) マクロの
+引数リストに
+.Ql \&.Xo
+マクロを使用しています。
+拡張マクロが使われることはあまりありません。使われるとすれば、リスト
+項目の引数リストを拡張する場合です。残念なことに、これが拡張マクロが
+最も懲り性であるところでもあります。最初の 2 つの例では、スペーシングは
+オフになっています。3 番目では、ある箇所にはスペーシングを入れることが
+望ましいのですが、出力全体に入れたいわけではありません。そのような状況
+でこれらのマクロが適切に動作するためには、
+.Ql \&.Xo
+と
+.Ql \&.Xc
+マクロが 3 番目の例にあるように指定されていることを確認してください。
+.Ql \&.Xo
+マクロが置かれた
+.Ql \&.It
+の引数リストに他のものが
+置かれると、スペーシングがどうなるかは予測不可能です。
+この場合、
+.Ql \&.Ns
+(空白なしマクロ) は行中の最初もしくは最後の
+マクロに指定してはいけません。現在
+.Bx
+でリリースされている 900 の
+マニュアルページ (実際のページでは約 1500 ページ) のうち 15 の
+マニュアルページでのみしか
+.Ql \&.Xo
+が使われていません。
+.Sh ページ構造のドメイン
+.Ss セクションヘッダ
+以下にリストされている、最初の 3 つのセクションヘッダマクロ
+.Ql \&.Sh
+はすべての man ページで必須のものです。
+残りのセクションヘッダはマニュアルページの作者の裁量において、
+推奨されているものです。
+.Ql \&.Sh
+マクロは 9 つまでの引数を取ることができます。
+これは解析されますが、呼び出し不可能です。
+.Bl -tag -width ".Sh SYNOPSIS"
+.It \&.Sh 名前
+.Sx 名前
+(NAME) マクロは必須のものです。
+これが指定されていないと、ヘッダとフッタ、それにデフォルトの
+ページレイアウトが設定されず、結果はかなり好ましくないものになるでしょう。
+.Sx NAME
+セクションは最低 3 つの項目からなります。
+最初のものは名称マクロ
+.Ql \&.Nm
+であり、man ページのサブジェクトと
+なります。2 番目のものは名称説明マクロ
+.Ql \&.Nd
+であり、
+サブジェクト名を 3 つめの項目、すなわちその名称の説明と分離します。
+説明に割り当てられるスペースは小さいものですので、
+できるだけ簡潔で分かりやすいものでなければなりません。
+.It \&.Sh 書式
+.Sx 書式
+(SYNOPSIS) セクションはその man ページのサブジェクト
+となっている項目の典型的な使用法を説明します。
+必須のマクロは
+.Ql ".Nm" ,
+.Ql ".Cd" ,
+.Ql ".Fn"
+のいずれかです。
+(他には
+.Ql ".Fo" ,
+.Ql ".Fc" ,
+.Ql ".Fd" ,
+.Ql ".Ft"
+の
+マクロも必要な場合があります。)
+関数名マクロ
+.Ql ".Fn"
+はセクション 2 と 3 のマニュアルページに
+おいて必須のもので、コマンドと一般名称マクロ
+.Ql \&.Nm
+は
+セクション 1, 5, 6, 7, 8 で必須の項目です。
+セクション 4 のマニュアルでは
+.Ql ".Nm"
+か
+.Ql ".Fd"
+、もしくは
+コンフィギュレーションデバイス使用法マクロ
+.Ql ".Cd"
+が必要です。
+その他のいくつかのマクロが下に示すような書式行を生成するために必要な
+ことがあります。
+.Pp
+.Bd -filled -offset indent
+.Nm cat
+.Op Fl benstuv
+.Op Fl
+.Ar
+.Ed
+.Pp
+以下のマクロが使われています。
+.Pp
+.Dl \&.Nm cat
+.Dl \&.Op \&Fl benstuv
+.Dl \&.Op \&Fl
+.Dl \&.Ar
+.Pp
+.Sy 注 :
+マクロ
+.Ql \&.Op ,
+.Ql \&.Fl ,
+.Ql \&.Ar
+は
+パイプの文字
+.Ql \*(Ba
+を認識し、下記のようなコマンド行
+.Pp
+.Dl ".Op Fl a | Fl b"
+.Pp
+はうまくいきません。
+.Xr troff
+は通常 \*(Ba を特別のオペレータとして
+解釈します。この他で \*(Ba が使える場合については
+.Sx 定義済みの文字列
+セクションを参照して下さい。
+.It \&.Sh 説明
+.Sx 説明
+(DESCRIPTION) セクションでの最初のテキストは、
+ほとんどの場合ではそのコマンド、関数もしくはファイルについての短い
+段落で、オプションの構文リストとそれぞれの説明がそれに続きます。
+そのようなリストを作成するには
+リスト開始マクロ
+.Ql \&.Bl
+、リスト項目マクロ
+.Ql \&.It
+、
+リスト終了マクロ
+.Ql \&.El
+を使います
+(後述の
+.Sx リストと列
+セクションを参照)。
+.El
+.Pp
+以下の
+.Ql \&.Sh
+のセクションヘッダはマニュアルページの好ましい
+レイアウトの一部であり、一貫性を保つために適切に使われなければ
+なりません。これらは使われる順番にリストされています。
+.Bl -tag -width SYNOPSIS
+.It \&.Sh 環境変数
+.Sx 環境変数
+(ENVIRONMENT) セクションは関連する環境変数を明らかにし、
+それらの振舞いや使用方法を示します。
+.It \&.Sh 例
+使用例、実行例を作成するには様々な方法があります。
+詳細については、下の
+.Sx 例
+のセクションを参照してください。
+.It \&.Sh ファイル
+man ページのサブジェクトによって使用されるか生成されるファイルで、
+.Sx ファイル
+のセクション中でマクロ
+.Ql \&.Pa
+によってリスト
+されます。
+.It \&.Sh 関連項目
+.Sx 関連項目
+(SEE ALSO) セクションには、その man ページの題材に
+関する資料への参照と他の関連する man ページへのクロスリファレンスが
+記載されます。クロスリファレンスは
+.Ql \&.Xr
+マクロによって指定
+されます。
+.Sx 関連項目
+セクションでのクロスリファレンスは
+セクション番号順に並べ、セクション中ではカンマで区切って
+アルファベット順に並べなければなりません。以下に例を示します。
+.Pp
+.Xr ls 1 ,
+.Xr ps 1 ,
+.Xr group 5 ,
+.Xr passwd 5 .
+.Pp
+ここで参考スタイルである
+.Xr refer 1
+は適応されていません。
+.It \&.Sh 準拠
+コマンドやライブラリ関数やファイルが、
+.St -p1003.2
+や
+.St -ansiC
+のような特定の実装によるものであれば、ここで記述します。
+コマンドがどの規格にも基づいていなければ、その歴史は
+.Sx 歴史
+(HISTORY)のセクションで説明されなければなりません。
+.It \&.Sh 歴史
+特定の規格に基づいていないコマンドは、
+このセクションでその歴史の概要が説明されるべきです。
+.It \&.Sh 作者
+クレジットが必要であれば、ここで入れます。
+.It \&.Sh 診断
+コマンドからの診断はこのセクションに入れます。
+.It \&.Sh エラー
+特定のエラーハンドリング、特にライブラリ関数
+(man ページのセクション 2, 3, 9) でのエラーハンドリングは、ここで説明します。
+.Ql \&.Er
+マクロが errno を記述するために使われます。
+.It \&.Sh バグ
+あきらかな問題はここで記述します...
+.El
+.Pp
+ユーザ指定の
+.Ql \&.Sh
+セクションを追加することができます。
+たとえば、このセクションは以下のように設定されています。
+.Bd -literal -offset 14n
+\&.Sh ページ構造領域
+.Ed
+.Ss 段落と行スペース
+.Bl -tag -width 6n
+.It \&.Pp
+.Ql \&.Pp
+段落コマンドは必要な場合に行スペースを指定するために使われます。
+このマクロは、
+.Ql \&.Sh
+マクロや
+.Ql \&.Ss
+マクロの後や、
+.Ql \&.Bl
+マクロの前では必要ありません。
+(
+.Ql \&.Bl
+マクロは -compact フラグが指定されていなければ、
+縦方向の距離を宣言します)。
+.El
+.\" This worked with version one, need to redo for version three
+.\" .Pp
+.\" .Ds I
+.\" .Cw (ax+bx+c) \ is\ produced\ by\ \&
+.\" .\".Cw (ax+bx+c) \&.Va_by_) \&_and_\& \&[?/]m_b1_e1_f1[?/]\&
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx\ (
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va ax
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy \+
+.\" .Cx
+.\" .Cl Cx \&(\&
+.\" .Va ax
+.\" .Cx +
+.\" .Va by
+.\" .Cx +
+.\" .Va c )
+.\" .Cx \t
+.\" .Em is produced by
+.\" .Cx \t
+.\" .Li \&.Va by
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy \+
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va c )
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx
+.\" .Cx
+.\" .Cw
+.\" .De
+.\" .Pp
+.\" This example shows the same equation in a different format.
+.\" The spaces
+.\" around the
+.\" .Li \&+
+.\" signs were forced with
+.\" .Li \e :
+.\" .Pp
+.\" .Ds I
+.\" .Cw (ax\ +\ bx\ +\ c) \ is\ produced\ by\ \&
+.\" .\".Cw (ax+bx+c) \&.Va_by_) \&_and_\& \&[?/]m_b1_e1_f1[?/]\&
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx\ (
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va a
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy x
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx \e\ +\e\ \e&
+.\" .Cx
+.\" .Cl Cx \&(\&
+.\" .Va a
+.\" .Sy x
+.\" .Cx \ +\ \&
+.\" .Va b
+.\" .Sy y
+.\" .Cx \ +\ \&
+.\" .Va c )
+.\" .Cx \t
+.\" .Em is produced by
+.\" .Cl Cx \t\t
+.\" .Li \&.Va b
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy y
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx \e\ +\e\ \e&
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va c )
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx
+.\" .Cx
+.\" .Cw
+.\" .De
+.\" .Pp
+.\" The incantation below was
+.\" lifted from the
+.\" .Xr adb 1
+.\" manual page:
+.\" .Pp
+.\" .Ds I
+.\" .Cw \&[?/]m_b1_e1_f1[?/]\& is\ produced\ by
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx Op Sy ?/
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Nm m
+.\" .Cx
+.\" .Cl Cx Op Sy ?/
+.\" .Nm m
+.\" .Ad \ b1 e1 f1
+.\" .Op Sy ?/
+.\" .Cx \t
+.\" .Em is produced by
+.\" .Cx \t
+.\" .Li \&.Ar \e\ b1 e1 f1
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Op Sy ?/
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx
+.\" .Cx
+.\" .Cw
+.\" .De
+.\" .Pp
+.Ss キープ
+現在実装されているキープは単語に対するものだけです。
+それらは
+.Ql \&.Bk
+(キープ開始) マクロと
+.Ql \&.Ek
+(キープ終了)
+マクロです。
+.Ql \&.Bk
+に指定できるオプションは
+.Fl words
+のみで
+あり、これはオプションの途中で改行が入らないようにするのに便利です。
+コマンド行の引数を生成する例 (
+.Sx この名前には何が...?
+セクションを
+参照) において、キープは
+.Xr nroff
+がフラグと引数を別の行に分けない
+ように使われています。 (実際には、オプションマクロがこの目的で使われて
+いましたが、オプションが行中にわたって散らばってしまうと一般的に見栄え
+が悪くなるという理由により
+.Xr troff
+で右揃えのマージンを強制的に
+行なう (宗教的な) 決定がなされてから、オプションマクロをこの目的で
+使わないようになりました。キープマクロについてはもっと機能を向上する
+作業が必要であり、
+.Fl line
+オプションを追加していく必要があります。)
+.Ss 例やディスプレイ
+ディスプレイには 5 つのタイプがあります。
+即席 1 行インデントディスプレイ
+.Ql \&.D1
+、
+即席 1 行リテラルディスプレイ
+.Ql \&.Dl
+、それに
+ディスプレイ開始マクロ
+.Ql \&.Bd
+と
+ディスプレイ終了マクロ
+.Ql \&.Ed
+を使用する
+リテラルブロック、フィルブロックおよび凸凹ブロックです。
+.Pp
+.Bl -tag -width \&.Dlxx
+.It Li \&.D1
+(D-いち) インデントされたテキストを 1 行表示します。
+このマクロは解析されますが、呼び出し不可能です。
+.Pp
+.Dl Fl ldghfstru
+.Pp
+これは次の指定で生成されます:
+.Li \&.Dl Fl ldghfstru
+.It Li \&.Dl
+(D-エル) インデントされた
+.Em リテラル
+テキストを 1 行表示します。
+.Ql \&.Dl
+マクロの例は本ファイルの中に渡って使われています。
+これによって 1 行のテキストのインデント (表示) が可能になります。
+このマクロは解析され、他のマクロを認識することができますが、
+デフォルトのフォントは固定幅 (リテラル) にセットされています。
+しかしながら、呼び出しは不可能です。
+.Pp
+.Dl % ls -ldg /usr/local/bin
+.Pp
+これは次の指定で生成されます:
+.Li \&.Dl % ls -ldg /usr/local/bin .
+.It Li \&.Bd
+ディスプレイ開始です。
+.Ql \&.Bd
+によるディスプレイは
+.Ql \&.Ed
+マクロによって
+終了しなければなりません。
+ディスプレイはディスプレイ内およびリスト内で入れ子にすることができます。
+.Ql \&.Bd
+は以下の書式をとります。
+.Pp
+.Dl ".Bd ディスプレイタイプ [-offset オフセット値] [-compact]"
+.Pp
+ディスプレイタイプは以下の 4 つのタイプの内の 1 つでなければならず、
+インデント
+.Ql \&.Bd
+のオフセット値を指定することができます。
+.Pp
+.Bl -tag -width "file file_name " -compact
+.It Fl ragged
+テキストのブロックをタイプされた通りに表示します。
+右マージン (と左マージン) のエッジは左に不揃いに寄せられます。
+.It Fl filled
+フィル (フォーマット) されたブロックを表示します。
+テキストのブロックがフォーマットされます
+(エッジは左非揃えではなく、フィルされます)。
+.It Fl literal
+リテラルなブロックを表示します。ソースコードや、単純にタブもしくは
+スペースで整えられたテキストで便利です。
+.It Fl file Ar ファイル名
+.Fl file
+フラグに続く名称のファイルが読み込まれ、表示されます。表示
+はリテラルなモードで行われ、タブは定幅文字 8 つ分に固定されますが、
+ファイル中のすべての
+.Xr troff/ Ns Nm \-mdoc
+コマンドは解釈されます。
+.It Fl offset Ar string
+.Fl offset
+が以下の文字列のいずれかとともに指定されていると、
+その文字列は次のテキストのブロックのインデントのレベルを示すものとして
+解釈されます。
+.Pp
+.Bl -tag -width indent-two -compact
+.It Ar left
+ブロックを現在の左マージンに揃えます。
+これは
+.Ql \&.Bd
+のデフォルトのモードです。
+.It Ar center
+ブロックを中央揃えにします。残念ながら現時点では、
+単にブロックの左側を仮想的な中央マージンに揃えるだけです。
+.It Ar indent
+デフォルトのインデント値もしくはタブの分だけインデントします。
+デフォルトのインデント値はディスプレイ
+.Ql \&.D1
+でも使われ、
+これら 2 つのタイプのディスプレイを使った場合、
+行が揃うことが保証されています。
+このインデントは通常 6n か約 2/3 インチ (定幅文字 6 つ分) です。
+.It Ar indent-two
+デフォルトのインデント値の 2 倍分インデントします。
+.It Ar right
+これはブロックをページの右端から約 2 インチ離して
+.Em 左
+揃えします。このマクロはちゃんと動作する必要があるのですが、
+.Xr troff
+ではまったくちゃんと動作してくれていません。
+.El
+.El
+.It .Ed
+ディスプレイ終了。
+.El
+.Ss フォントモード
+マニュアルページのテキストの見栄えを変更するマクロは 5 つあります。
+.Bl -tag -width \&.Emxx
+.It \&.Em
+テキストは
+.Ql \&.Em
+マクロで強調することができます。
+強調の場合、通常イタリック体のフォントが使われます。
+.Pp
+.Dl 使い方: .Em argument ... \*(Pu
+.Bl -tag -width ".Em vide infra ) ) ," -compact -offset 14n
+.It Li ".Em does not"
+.Em does not
+.It Li ".Em exceed 1024 ."
+.Em exceed 1024 .
+.It Li ".Em vide infra ) ) ,"
+.Em vide infra ) ),
+.El
+.Pp
+.Ql \&.Em
+マクロは解析され、呼び出し可能です。
+.Ql \&.Em
+を引数なしで呼び出すのはエラーです。
+.It \&.Li
+リテラルマクロ
+.Ql \&.Li
+は特殊文字や変数定数、その他タイプされた
+通りに表示する必要があるものに使用することができます。
+.Pp
+.Dl 使い方: .Li argument ... \*(Pu
+.Bl -tag -width ".Li cntrl-D ) ," -compact -offset 14n
+.It Li \&.Li \een
+.Li \en
+.It Li \&.Li M1 M2 M3\ ;
+.Li M1 M2 M3 ;
+.It Li \&.Li cntrl-D\ )\ ,
+.Li cntrl-D ) ,
+.It Li \&.Li 1024\ ...
+.Li 1024 ...
+.El
+.Pp
+.Ql \&.Li
+マクロは解析され、呼び出し可能です。
+.It \&.Sy
+シンボリック体強調マクロはシンボリックの意味でも
+伝統的な英語の使いかたにおいても、
+通常はボールドマクロとなっています。
+.Pp
+.Dl 使い方: .Sy symbol ... \*(Pu
+.Bl -tag -width ".Sy Important Noticex" -compact -offset 14n
+.It Li \&.Sy Important Notice
+.Sy Important Notice
+.El
+.Pp
+.Ql \&.Sy
+マクロは解析され、呼び出し可能です。
+.Ql \&.Sy
+の引数は引用符で囲むことができます。
+.It Li \&.Bf
+フォントモード開始。
+フォントモード
+.Ql \&.Bf
+は
+.Ql \&.Ef
+マクロで
+終了しなければなりません。
+フォントモードは他のフォントモードと入れ子にすることができます。
+.Ql \&.Bf
+は次の構文を取ります。
+.Pp
+.Dl ".Bf font-mode"
+.Pp
+font-mode は以下の 3 つのタイプのうちのいずれかでなければなりません。
+.Pp
+.Bl -tag -width "file file_name " -compact
+.It Sy \&Em | Fl emphasis
+強調モード。
+.Ql \&.Em
+マクロがテキストブロック全体に使われているのと同様です。
+.It Sy \&Li | Fl literal
+リテラルモード。
+.Ql \&.Li
+マクロがテキストブロック全体に使われているのと同様です。
+.It Sy \&Sy | Fl symbolic
+シンボリックモード。
+.Ql \&.Sy
+マクロがテキストブロック全体に使われているのと同様です。
+.El
+.It .Ef
+フォントモードの終了。
+.El
+.Ss タグ付きリストと列
+リスト開始マクロ
+.Ql ".Bl"
+で開始されるリストにはいくつかのタイプが
+あります。リスト中の項目は項目マクロ
+.Ql ".It"
+で指定され、各リスト
+は
+.Ql ".El"
+マクロで終了しなければなりません。リストはリスト自身や
+ディスプレイの中で入れ子にすることができます。列はリストの中で使うこと
+ができますが、リストが列の中で使えるかどうかは検証されていません。
+.Pp
+さらに、タグの幅、リストのオフセット、コンパクトさ(項目間の空白行が
+許されているかどうか) のような、いくつかのリストの属性を指定することが
+できます。本ドキュメントのほとんどはタグ
+.Pq Fl tag
+スタイルリストで
+フォーマットされています。各種リストタイプは、調子を変えるために
+オーバーハング
+.Pq Fl ohang
+でリストしました。
+このリストのタイプは
+.Tn TeX
+のユーザに非常に人気のあるものですが、
+tag リストで構成されたページを何ページも読んだ後には幾分変に見える
+でしょう。以下のリストタイプを
+.Ql ".Bl"
+で使うことができます。
+.Pp
+.Bl -ohang -compact
+.It Fl bullet
+.It Fl item
+.It Fl enum
+これら 3 つは最も単純なリストのタイプです。
+一旦
+.Ql ".Bl"
+マクロが与えられると、リスト中の項目は
+単に
+.Ql ".It"
+マクロによってのみ構成される行で指定されます。
+例として、簡単な列挙リストのソーステキストは、このようになります。
+.Bd -literal -offset indent-two
+\&.Bl -enum -compact
+\&.It
+\&ひとつめはここ。
+\&.It
+\&そしてふたつめ。
+\&.It
+\&最後にみっつめはここ。
+\&.El
+.Ed
+.Pp
+これらの結果は以下のようになります。
+.Pp
+.Bl -enum -offset indent-two -compact
+.It
+ひとつめはここ。
+.It
+そしてふたつめ。
+.It
+最後にみっつめはここ。
+.El
+.Pp
+簡単な bullet リスト構成の例を示します。
+.Bd -literal -offset indent-two
+\&.Bl -bullet -compact
+\&.It
+\&ひとつめの bullet。
+\&.It
+\&これはふたつめの bullet。
+\&.El
+.Ed
+.Pp
+これは以下のような結果になります。
+.Bl -bullet -offset indent-two -compact
+.It
+ひとつめの bullet。
+.It
+これはふたつめの bullet。
+.El
+.Pp
+.It Fl tag
+.It Fl diag
+.It Fl hang
+.It Fl ohang
+.It Fl inset
+これらのリストタイプは
+.Ql \&.It
+マクロによって指定されている引数
+からラベルを生成します。
+そして、
+.Em inset
+では、次のテキストへそのラベルを挿入します。
+.Em hang
+では、次のテキストをラベルの位置へインデントします。
+.Em ohang
+(オーバーハング) では、次のテキストをラベルの位置に
+ぶら下げ、インデントしません。
+.Em tag
+では、タグつきテキストの形式にします。ちなみに上のリストは
+.Ql Fl ohang
+リストタイプで構成されています。
+.Ql \&.It
+マクロは inset, hang, tag のリストタイプでのみ解析され、
+呼び出し不可能です。以下に inset ラベルの例を示します。
+.Bl -inset -offset indent
+.It Em Tag
+tag リスト (tag 段落とも呼ばれる) は、
+Berkely マニュアルで使われているリストのうち最も一般的なタイプです。
+.It Em Diag
+診断リストはセクション 4 の診断リストを生成するもので、
+呼び出し可能なマクロが無視されることを除き、inset リストと似ています。
+.It Em Hang
+hang ラベルは好みの問題です。
+.It Em Ohang
+ohang ラベルはスペースに制限がある時に便利です。
+.It Em Inset
+inset ラベルは段落のブロックを制御するのに便利で、
+.Nm \-mdoc
+マニュアルを他の形式に変換する時に役立ちます。
+.El
+.Pp
+上の例を生成したソーステキストはこうなっています。
+.Bd -literal -offset indent
+\&.Bl -inset -offset indent
+\&.It Em Tag
+\&tag リスト (tag 段落とも呼ばれる) は、
+\&Berkely マニュアルで使われているリストのうち最も一般的なタイプです。
+\&.It Em Diag
+\&診断リストはセクション 4 の診断リストを生成するもので、
+\&呼び出し可能なマクロが無視されることを除き、inset リストと似ています。
+\&.It Em Hang
+\&hang ラベルは好みの問題です。
+\&.It Em Ohang
+\&ohang ラベルはスペースに制限がある時に便利です。
+\&.It Em Inset
+\&inset ラベルは段落のブロックを制御するのに便利で、
+\&.Nm \-mdoc
+\&マニュアルを他の形式に変換する時に役立ちます。
+\&.El
+.Ed
+.Pp
+以下は 2 つの項目を持つ hang リストです。
+.Bl -hang -offset indent
+.It Em Hanged
+ラベルがラベルの幅より小さいときには、
+ラベルは tag リストと同じようになります。
+.It Em 長い hang リストラベル
+は、tag 段落のラベルとは異なり、
+段落の中に埋め込まれます。
+.El
+.Pp
+これを生成している元のテキストは以下の通りです。
+.Bd -literal -offset indent
+\&.Bl -hang -offset indent
+\&.It Em Hanged
+\&ラベルがラベルの幅より小さいときには、
+\&ラベルは tag リストと同じようになります。
+\&.It Em 長い hang リストラベル
+\&は、tag 段落のラベルとは異なり、
+\&段落の中に埋め込まれます。
+\&.El
+.Ed
+.Pp
+タグ幅を制御するためのオプションの幅指定を使ったタグつきリストは
+以下の通りです。
+.Pp
+.Bl -tag -width PAGEIN -compact -offset indent
+.It SL
+プロセスが sleep している時間 (ブロックされた秒数)
+.It PAGEIN
+そのプロセスによるコアにロードされていないページへの参照による
+ディスク
+.Tn I/O
+の回数
+.It UID
+プロセスの所有者の数字表記によるユーザID
+.It PPID
+親プロセスの数字表記によるID、プロセスの優先度
+(割り込み不可のウエイトであるときには非正値)
+.El
+.Pp
+The raw text:
+.Bd -literal -offset indent
+\&.Bl -tag -width "PAGEIN" -compact -offset indent
+\&.It SL
+\&プロセスが sleep している時間 (ブロックされた秒数)
+\&.It PAGEIN
+\&そのプロセスによるコアにロードされていないページへの参照によるディスク
+\&.Tn I/O
+\&の回数
+\&.It UID
+\&プロセスの所有者の数字表記によるユーザID
+\&.It PPID
+\&親プロセスの数字表記によるID、プロセスの優先度
+\&(割り込み不可のウエイトであるときには非正値)
+\&.El
+.Ed
+.Pp
+幅指定として以下のものを使うことができます。
+.Bl -tag -width Ar -offset indent
+.It Fl width Ar \&Fl
+そのフラグでのデフォルトの幅を指定します。すべての呼び出し可能なマクロ
+は各々デフォルトの幅の値を持っています。現在、
+.Ql \&.Fl
+の値は定幅
+文字 10 個分、もしくは約 5/6 インチとなっています。
+.It Fl width Ar 24n
+定幅文字 24 個分の幅、もしくは約 2 インチの幅をセットします。
+これが正しく動作するには
+.Ql n
+が必ず必要となります。
+.It Fl width Ar ENAMETOOLONG
+指定された文字列の固定長に幅をセットします。
+.It Fl width Ar "\*qint mkfifo\*q"
+これも、指定された文字列の固定長に幅をセットします。
+.El
+.El
+.Pp
+タグつきリストタイプで幅が指定されていないと、
+.Ql \&.It
+が最初に
+起動された時に適した幅を決定することが試みられます。
+.Ql ".It"
+の
+最初の引数が呼び出し可能なマクロであれば、そのマクロのデフォルトの幅が
+そのマクロ名が幅として指定されたように使用されます。しかしながら、その
+リスト中に他の項目が別の呼び出し可能なマクロ名で与えられていると、
+新しく入れ子となったリストとして処理されます。
+.Sh 定義済みの文字列
+以下の文字列はあらかじめ定義されているものであり、troff の文字列解釈
+シーケンス
+.Ql \&\e*(xx
+もしくは
+.Ql \&\e*x
+を前に伴って使われます。
+ここで、
+.Em xx
+もしくは
+.Em x
+は定義されている文字列の名称です。
+解釈シーケンスはテキストのどこでも使うことができます。
+.Pp
+.Bl -column "String " "Nroff " "Troff " -offset indent
+.It Sy "文字列 Nroff Troff"
+.It Li <= Ta \&<\&= Ta \*(<=
+.It Li >= Ta \&>\&= Ta \*(>=
+.It Li Rq Ta '' Ta \*(Rq
+.It Li Lq Ta `` Ta \*(Lq
+.It Li ua Ta ^ Ta \*(ua
+.It Li aa Ta ' Ta \*(aa
+.It Li ga Ta \` Ta \*(ga
+.\" .It Li "sL" Ta ` Ta \*(sL
+.\" .It Li "sR" Ta ' Ta \*(sR
+.It Li q Ta \(dq Ta \*q
+.It Li Pi Ta pi Ta \*(Pi
+.It Li Ne Ta != Ta \*(Ne
+.It Li Le Ta <= Ta \*(Le
+.It Li Ge Ta >= Ta \*(Ge
+.It Li Lt Ta < Ta \*(Gt
+.It Li Gt Ta > Ta \*(Lt
+.It Li Pm Ta +- Ta \*(Pm
+.It Li If Ta infinity Ta \*(If
+.It Li Na Ta \fINaN\fP Ta \*(Na
+.It Li Ba Ta \&| Ta \*(Ba
+.El
+.Pp
+.Sy 注 :
+.Ql q
+の名称がつけられている文字列は、
+1 文字であるため
+.Ql \e*q
+と書かなければなりません。
+.Sh 診断
+.Nm \-mdoc
+は限られたデバッグ機能しか持っていませんが、
+引数名と内部レジスタやマクロ名との衝突のような
+潜在的なエラーを検出するのに役立ちます。 (A って何?)
+レジスタは
+.Xr troff
+での演算用記憶クラスであり、
+1 文字か 2 文字の名称がついています。
+.Xr troff
+と
+.Xr ditroff
+での
+.Nm \-mdoc
+のすべての内部レジスタは
+.Ql \&Ar
+のように2 文字からなる <大文字><小文字> の形式か、
+.Ql \&aR
+のように <小文字><大文字> の形式か、
+.Ql \&C\&1
+のように <大文字もしくは小文字><数字>
+の形式を取ります。
+さらに混乱することに、
+.Xr troff
+はそれ自身の内部レジスタを持ち、
+それらすべては小文字 2 文字か、ドットに文字もしくはメタ文字が続く形式を取ります。
+紹介例の 1 つに、エスケープシーケンス
+.Ql \e&
+でマクロ名を
+解釈させない方法がありました。これは内部レジスタ名にも有効です。
+.Pp
+.\" Every callable macro name has a corresponding register
+.\" of the same name (<upper_case><lower_case>).
+.\" There are also specific registers which have
+.\" been used for stacks and arrays and are listed in the
+.\" .Sx Appendix .
+.\" .Bd -ragged -offset 4n
+.\" [A-Z][a-z] registers corresponding to macro names (example ``Ar'')
+.\" [a-z][A-Z] registers corresponding to macro names (example ``aR'')
+.\" C[0-9] argument types (example C1)
+.\" O[0-9] offset stack (displays)
+.\" h[0-9] horizontal spacing stack (lists)
+.\" o[0-9] offset (stack) (lists)
+.\" t[0-9] tag stack (lists)
+.\" v[0-9] vertical spacing stack (lists)
+.\" w[0-9] width tag/label stack
+.\" .Ed
+.\" .Pp
+エスケープされていないレジスタ名が引数リストに指定されると、
+予期できない振舞いとなります。
+一般的には、テキストのかなり大きな部分が出力されるべきところに
+出力されないとか、リストのタグのような小さな文字列が消えてしまうとか、
+引数リストの中の引数のタイプが間違って解釈されるとかいうことが、起こり得ます。
+きっとあなたのお母さんは、あなたにこんな面倒なことを覚えるようにとは
+考えていないでしょう。
+そこで、与えられた引数が有効か無効かを判断する方法があります。
+
+そんなときには、
+.Ql \&.Db
+(デバッグ) マクロによってほとんどのマクロ
+の引数リストがどう解釈されるかを表示することができます。
+.Ql \&.Pp
+(段落) マクロのようなマクロはデバッグ情報を含んでいません。呼び出し可能
+なマクロはすべてデバッグ情報を含んでおり、疑いがある場合はいつでも
+.Ql \&.Db
+マクロをオンにすることを強くお勧めします。
+.Pp
+.Dl 使い方: \&.Db [on | off]
+.Pp
+以下の例では、問題が故意に発生するようにされた部分の上と下で
+デバッグマクロが指定されています
+(フラグ引数
+.Ql \&aC
+は正しく動作するためには
+.Ql \e&aC
+でなければなりません)。
+.Bd -literal -offset indent
+\&.Db on
+\&.Op Fl aC Ar file )
+\&.Db off
+.Ed
+.Pp
+この結果の出力は以下の通りです。
+.Bd -literal -offset indent
+DEBUGGING ON
+DEBUG(argv) MACRO: `.Op' Line #: 2
+ Argc: 1 Argv: `Fl' Length: 2
+ Space: `' Class: Executable
+ Argc: 2 Argv: `aC' Length: 2
+ Space: `' Class: Executable
+ Argc: 3 Argv: `Ar' Length: 2
+ Space: `' Class: Executable
+ Argc: 4 Argv: `file' Length: 4
+ Space: ` ' Class: String
+ Argc: 5 Argv: `)' Length: 1
+ Space: ` ' Class: Closing Punctuation or suffix
+ MACRO REQUEST: .Op Fl aC Ar file )
+DEBUGGING OFF
+.Ed
+.Pp
+この情報の最初の行では呼び出されているマクロの名称が出力されています。
+ここでは
+.Ql \&.Op
+とそれが現れた行番号が表示されています。
+複数のファイルが処理されている場合
+(特にテキストが他のファイルからインクルードされている場合)、
+行番号は正しくないでしょう。
+ファイルが 1 つだけの場合には正しい行番号が出力されます。
+2 番目の行では引数の個数と引数
+.Pq Ql \&Fl
+とその長さが
+出力されています。引数の長さが 2 文字であれば、
+その引数が実行可能
+(ゼロでない値を含むすべてのレジスタは実行可能なように見えます)
+かどうかテストされます。
+3 番目の行ではそのクラスで指定されているスペースとクラスタイプが
+出力されています。
+ここでの問題は引数 aC が実行不可能でなければならないことです。
+クラスの 4 つのタイプは文字列、実行可能、閉じる句読点、開く句読点です。
+最後の行では引数リスト全体が読み込まれた通りに表示されています。
+次の例では問題の原因となっている
+.Ql \&aC
+がエスケープされています。
+.Bd -literal -offset indent
+\&.Db on
+\&.Em An escaped \e&aC
+\&.Db off
+.Ed
+.Bd -literal -offset indent
+DEBUGGING ON
+DEBUG(fargv) MACRO: `.Em' Line #: 2
+ Argc: 1 Argv: `An' Length: 2
+ Space: ` ' Class: String
+ Argc: 2 Argv: `escaped' Length: 7
+ Space: ` ' Class: String
+ Argc: 3 Argv: `aC' Length: 2
+ Space: ` ' Class: String
+ MACRO REQUEST: .Em An escaped &aC
+DEBUGGING OFF
+.Ed
+.Pp
+.Ql \e&
+シーケンスは長さが 0 となるために
+引数
+.Ql \e&aC
+は先の例と同様に長さ 2 と表示されています。
+しかし、
+.Ql \e&aC
+という名称のレジスタが見つからず、
+タイプは文字列と判断されています。
+.Pp
+この他の診断は使用方法を報告するものであり、
+それ自身が説明を含んでいます。
+.Sh GROFF, TROFF, NROFF
+.Nm \-mdoc
+パッケージは
+.Xr groff
+との互換モードは
+必要ではありません。
+.Pp
+このパッケージでは改ページと、
+.Xr nroff
+で改ページ時に通常挿入
+されるヘッダとフッタは禁止されており、マニュアルをオンラインで効率良く
+見ることができるようになっています。現在の所、
+.Fl T Ns Ar ascii
+が
+指定された
+.Xr groff
+はページ内容の無いファイル末の残りの部分まで
+出力します。改ページを禁止することによって
+.Xr nroff
+による出力は
+ハードコピーには適さないものとなっています。サイト依存のスタイル
+ファイル
+.Pa /usr/src/share/tmac/doc-nroff
+において 0 にセットする
+ことができる
+.Ql \&cR
+の名称を持つレジスタが古いスタイルの振る舞い
+を実現するために用意されています。
+.Sh ファイル
+.Bl -tag -width /usr/share/man0/template.doc -compact
+.It Pa /usr/share/tmac/doc.tmac
+マニュアルマクロパッケージ
+.It Pa /usr/share/misc/mdoc.template
+man ページを書くためのテンプレート
+.It Pa /usr/share/examples/mdoc/*
+man ページのいくつかの例
+.El
+.Sh バグ
+フラグ引き数のダッシュが意図せずハイフンにより折り返しになるバグは
+まだ修正されておらず、
+.Sx DESCRIPTION
+セクションでときどき
+意図しない動作 (ハイフンでの改行) が起こることがある。
+.Pp
+あらかじめ定義されている文字列は文書において宣言されていません。
+.Pp
+セクション 3f はヘッダルーチンには追加されていません。
+.Pp
+.Ql \&.Nm
+フォントは
+.Sx 名前
+セクションにおいて
+変更されるべきです。
+.Pp
+.Ql \&.Fn
+は分割されるのを防止するために、行の長さが短すぎないか
+どうかをチェックする必要があります。ときどき、最後の括弧が分割される
+ことがあり、行がフィルモードであるときには全くおかしな結果になること
+があります。
+.Pp
+nroff 使用時に、(最初のヘッダとフッタ以外の) 改ページ時のヘッダと
+フッタの挿入を行わないようにするのに使用される命令によって、
+ときどき見るに耐えない部分的な行詰め (や空行) がページの末尾に
+発生する場合がある。
+.Pp
+.\" Note what happens if the parameter list overlaps a newline
+.\" boundary.
+.\" to make sure a line boundary is crossed:
+.\" .Bd -literal
+.\" \&.Fn struct\e\ dictionarytable\e\ *dictionarylookup struct\e\ dictionarytable\e\ *tab[]
+.\" .Ed
+.\" .Pp
+.\" produces, nudge nudge,
+.\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] ,
+.\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] ,
+.\" nudge
+.\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] .
+.\" .Pp
+.\" If double quotes are used, for example:
+.\" .Bd -literal
+.\" \&.Fn \*qstruct dictionarytable *dictionarylookup\*q \*qchar *h\*q \*qstruct dictionarytable *tab[]\*q
+.\" .Ed
+.\" .Pp
+.\" produces, nudge nudge,
+.\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" ,
+.\" nudge
+.\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" ,
+.\" nudge
+.\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" .
+.\" .Pp
+.\" Not a pretty sight...
+.\" In a paragraph, a long parameter containing unpaddable spaces as
+.\" in the former example will cause
+.\" .Xr troff
+.\" to break the line and spread
+.\" the remaining words out.
+.\" The latter example will adjust nicely to
+.\" justified margins, but may break in between an argument and its
+.\" declaration.
+.\" In
+.\" .Xr nroff
+.\" the right margin adjustment is normally ragged and the problem is
+.\" not as severe.
+リストマクロとディスプレイマクロはキープを行いませんが、
+これはキープを行うべきです。
+.Sh 関連項目
+.Xr man 1 ,
+.Xr troff 1 ,
+.Xr groff_mdoc 7 ,
+.Xr mdoc 7
+.Sh この文書について
+この man ページは Linux
+.Em man-pages
+プロジェクトのリリース 3.40 の
+一部である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man-pages/ に書かれている。