138 lines
3.9 KiB
Groff
138 lines
3.9 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>.
|
|
.\"
|
|
.Dd Jan 12, 1996
|
|
.Dt RFORK 2
|
|
.Os
|
|
.Sh 名称
|
|
.Nm rfork
|
|
.Nd プロセスリソースの操作
|
|
.Sh 書式
|
|
.Fd #include <unistd.h>
|
|
.Ft int
|
|
.Fn rfork "int flags"
|
|
.Sh 解説
|
|
fork, vfork, と rfork が新しいプロセスが作成される唯一の方法です。
|
|
.Fn rfork
|
|
への
|
|
.Fa flags
|
|
引数は、起動しているプロセス (親) のどのリソースが、新しいプロセス (子) に
|
|
よって共有されるか、またはそれらのデフォルト値に初期化されるかを選択します。
|
|
リソースにはオープンファイル記述子テーブル (これは、共有されたとき、
|
|
プロセスが他のプロセスについてファイルを開閉することを
|
|
許容します) およびオープンファイルが含まれます。
|
|
.Fa flags
|
|
は次の項目の倫理和 (OR) です。
|
|
.Bl -tag -width "RFCNAMEG" -compact -offset indent
|
|
.It RFPROC
|
|
設定されている場合、新しいプロセスが
|
|
作成されます。そうでない場合、変更が現在のプロセスに影響を及ぼします。
|
|
現在のシステムでは、このフラグがいつでも設定されていることが要求されます。
|
|
.It RFNOWAIT
|
|
設定されている場合、子プロセスは親から分離されます。終了時に、子は、
|
|
親が集めるステータスを残しません。
|
|
.Xr wait 2
|
|
を参照してください。
|
|
.It RFFDG
|
|
設定されている場合、起動側のファイル記述子テーブル
|
|
.Pf ( Xr intro 2
|
|
を参照) が
|
|
コピーされます。そうでない場合、2 つのプロセスが 1 つのテーブルを共有します。
|
|
.It RFCFDG
|
|
設定されている場合、新しいプロセスは新しいファイル記述子テーブルで
|
|
開始します。
|
|
.Dv RFFDG
|
|
とは互いに排他的です。
|
|
.It RFMEM
|
|
設定されている場合、カーネルは、アドレス空間全体の共有を強制します。
|
|
その際、子は、親プロセスが所有しているすべての共有セグメントを継承します。
|
|
他のセグメントタイプは影響を受けません。親による後続の fork は、
|
|
子の間で共通データと bss を影響させます。
|
|
スタックセグメントは常に分割されます。
|
|
.Dv RFPROC
|
|
とだけ共に設定することになるでしょう。
|
|
.It RFSIGSHARE
|
|
設定されている場合、カーネルは、親子間で sigacts 構造体を共有することを
|
|
強制します。
|
|
.It 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 [EAGAIN]
|
|
.It Bq Er EAGAIN
|
|
実行中のプロセスの合計数がシステムの課す制限を超過してしまいます。
|
|
制限は
|
|
.Xr sysctl 3
|
|
MIB 変数
|
|
.Dv KERN_MAXPROC
|
|
によって指定されます (スーパユーザを除いて、制限は実際には
|
|
これより 1 少なくなります)。
|
|
.It Bq Er EAGAIN
|
|
ユーザがスーパユーザではなく、
|
|
1 人のユーザによる実行中のプロセスの合計数
|
|
がシステムの課した制限を超過してしまいます。制限は、
|
|
.Xr sysctl 3
|
|
MIB 変数
|
|
.Dv KERN_MAXPROCPERUID
|
|
によって指定されます。
|
|
.It Bq Er EAGAIN
|
|
ユーザがスーパユーザではなく、リソースパラメータ
|
|
.Dv RLIMIT_NOFILE
|
|
に対応するソフトリソースの限界を超過してしまいます
|
|
.Pf ( Xr getrlimit 2
|
|
を参照)。
|
|
.It Bq Er EINVAL
|
|
RFPROC フラグが指定されませんでした。
|
|
.It Bq Er EINVAL
|
|
RFFDG フラグと RFCFDG フラグの両方が指定されました。
|
|
.It Bq Er ENOMEM
|
|
新しいプロセス用に十分なスワップ空間が不足しました。
|
|
.El
|
|
.Sh 関連項目
|
|
.Xr fork 2 ,
|
|
.Xr intro 2 ,
|
|
.Xr minherit 2 ,
|
|
.Xr vfork 2
|
|
.Sh 歴史
|
|
.Fn rfork
|
|
関数は
|
|
Plan9
|
|
ではじめて登場しました。
|