Submitted by: Akira Ikeuchi <a_ikeuchi@mic.mitsumi.co.jp> Reviewed by: Watanabe Kazuhiro <CQG00620@nifty.ne.jp>
169 lines
4.7 KiB
Groff
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 ではじめて登場しました。
|