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