doc/ja_JP.eucJP/man/man2/rfork.2
SUZUKI Koichi b7d11eb685 Catch up with 5.3-BETA1 for man2.
Submitted by:   Akira Ikeuchi <a_ikeuchi@mic.mitsumi.co.jp>
Reviewed by:    Watanabe Kazuhiro <CQG00620@nifty.ne.jp>
2004-09-21 20:33:15 +00:00

169 lines
4.7 KiB
Groff

.\"
.\" This manual page is taken directly from Plan9, and modified to
.\" describe the actual BSD implementation. Permission for
.\" use of this page comes from Rob Pike <rob@plan9.att.com>.
.\"
.\" %FreeBSD: src/lib/libc/sys/rfork.2,v 1.32 2004/07/02 23:52:13 ru Exp %
.\"
.\" $FreeBSD$
.Dd January 31, 2003
.Dt RFORK 2
.Os
.Sh 名称
.Nm rfork
.Nd プロセスリソースの操作
.Sh ライブラリ
.Lb libc
.Sh 書式
.In unistd.h
.Ft pid_t
.Fn rfork "int flags"
.Sh 解説
fork, vfork, rfork は、新しいプロセスが作成される唯一の方法です。
.Fn rfork
への引数
.Fa flags
は、起動しているプロセス (親) のどのリソースが新しいプロセス (子) に
よって共有されるか、またはそれらのデフォルト値に初期化されるかを選択します。
リソースにはオープンファイル記述子テーブル (これは、共有される場合、
プロセスが他のプロセスについてファイルを開閉することを
許容します) およびオープンファイルが含まれます。
.Fa flags
引数は次の項目の論理和 (OR) です:
.Bl -tag -width ".Dv RFLINUXTHPN"
.It Dv RFPROC
設定されている場合、新しいプロセスが作成されます。
そうでない場合、変更が現在のプロセスに影響を及ぼします。
.It Dv RFNOWAIT
設定されている場合、子プロセスは親プロセスから分離されます。
終了時に、子プロセスは、親プロセスが集めるステータスを残しません。
.Xr wait 2
を参照してください。
.It Dv RFFDG
設定されている場合、起動側のファイル記述子テーブル
.Xr ( intro 2
を参照) がコピーされます。
そうでない場合、2 つのプロセスが 1 つのテーブルを共有します。
.It Dv RFCFDG
設定されている場合、新しいプロセスは新しいファイル記述子テーブルを持って
開始します。
.Dv RFFDG
とは互いに排他的です。
.It Dv RFMEM
設定されている場合、
通常、ハードウェアのページテーブルを直接共有することで、
カーネルはアドレス空間全体を強制的に共有します。
子は、このような方法で、親プロセスが所有しているすべてのセグメントを、
それが普段共有可能であるか否かに関係なく、継承し共有します。
スタックセグメントは分割されない
(親と子の両方が同じスタック上に復帰する) ので、RFMEM フラグを指定した
.Fn rfork
は一般に、C 言語を含む高級言語から直接呼び出すことはできません。
共に設定可能なフラグは
.Dv RFPROC
だけです。
この問題を解決し、提供されたスタック上で新しいプロセスを
走らせるために補助関数が提供されています。
詳しくは
.Xr rfork_thread 3
を参照してください。
.It Dv RFSIGSHARE
設定されている場合、カーネルは、親子間で sigacts 構造体を強制的に共有します。
.It Dv RFLINUXTHPN
設定されている場合、カーネルは、子についてのスレッド終了時に、
SIGCHILD の代わりに SIGUSR1 を返します。
これは特定の Linux クローン動作を模倣するためです。
.El
.Pp
共有ファイル記述子テーブル内のファイル記述子は、
明示的に閉じられるか、またはテーブルを
共有しているすべてのプロセスが終了するまで開いたままに保たれます。
.Pp
.Dv RFPROC
が設定されている場合、
親プロセス内で返される値は子プロセスのプロセス ID です。
子プロセス内で返される値は 0 です。
.Dv RFPROC
がない場合、戻り値は 0 です。
プロセス ID の範囲は 1 から最大整数値
.Ft ( int )
です。
必要であれば、要求されたプロセスリソースが利用できるようになるまで
.Fn rfork
システムコールは待機します。
.Pp
.Fn fork
システムコールは、
.Fn rfork "RFFDG | RFPROC"
への呼び出しとして実装可能ですが、後方互換性のために
そのようには実装されていません。
.Sh 戻り値
正常に完了した場合、
.Fn rfork
は、子プロセスに値 0 を返し、子プロセスのプロセス ID を親プロセスに
返します。
そうでない場合、子プロセスは作成されずに、値 -1 が親プロセスに返され、
エラーを示すためにグローバル変数
.Va errno
が設定されます。
.Sh エラー
.Fn rfork
システムコールは、次の場合に処理を失敗し、子プロセスは作成されません:
.Bl -tag -width Er
.It Bq Er EAGAIN
実行中のプロセスの合計数がシステムの課す制限を超過してしまいます。
制限は
.Xr sysctl 3
MIB 変数
.Dv KERN_MAXPROC
によって指定されます (スーパユーザを除いて、制限は実際には
これより 10 個少なくなります)。
.It Bq Er EAGAIN
ユーザがスーパユーザではなく、1 人のユーザによる実行中の
プロセスの合計数がシステムの課した制限を超過してしまいます。
制限は、
.Xr sysctl 3
MIB 変数
.Dv KERN_MAXPROCPERUID
によって指定されます。
.It Bq Er EAGAIN
ユーザがスーパユーザではなく、
.Fa resource
引数
.Dv RLIMIT_NOFILE
に対応するソフトリソースの制限を超過してしまいます
.Pf ( Xr getrlimit 2
を参照)。
.It Bq Er EINVAL
RFFDG フラグと RFCFDG フラグの両方が指定されました。
.It Bq Er EINVAL
これまでに列挙されていないフラグが指定されました。
.It Bq Er ENOMEM
新しいプロセス用に十分なスワップ空間が不足しました。
.El
.Sh 関連項目
.Xr fork 2 ,
.Xr intro 2 ,
.Xr minherit 2 ,
.Xr vfork 2 ,
.Xr rfork_thread 3
.Sh バグ
.Fx
では、ネイティブな
.Fn clone
ライブラリコールは未だに実装されていませんし、
現在の pthreads 実装は RFMEM を指定した
.Fn rfork
を利用していません。
linux スレッドライブラリのネイティブポートである、
.Pa /usr/ports/devel/linuxthreads
は RFMEM を利用して動作する
.Fn clone
呼び出しを含んでいます。
.Xr rfork_thread 3
関数は
.Fn clone
の代わりとして利用することができます。
.Sh 歴史
.Fn rfork
関数は Plan9 ではじめて登場しました。