RFORK(2) | FreeBSD System Calls Manual | RFORK(2) |
名称
rfork — プロセスリソースの操作ライブラリ
Standard C Library (libc, -lc)解説
fork, vfork, rfork は、新しいプロセスが作成される唯一の方法です。 rfork() への引数 flags は、起動しているプロセス (親) のどのリソースが新しいプロセス (子) によって共有されるか、またはそれらのデフォルト値に初期化されるかを選択します。リソースにはオープンファイル記述子テーブル (これは、共有される場合、プロセスが他のプロセスについてファイルをオープンしてクローズすることを許容します) およびオープンファイルが含まれます。 flags 引数は、次の項目の論理和 (OR) です:- RFPROC
- 設定されているなら、新しいプロセスが作成されます。そうでないなら、変更が現在のプロセスに影響を及ぼします。
- RFNOWAIT
- 設定されているなら、子供のプロセスは親プロセスから分離されます。終了時に、子供のプロセスは、親プロセスが集めるステータスを残しません。 wait(2) を参照してください。
- RFFDG
- 設定されているなら、起動側のファイル記述子テーブル ( intro(2) を参照) がコピーされます。そうでないなら、2 つのプロセスが 1 つのテーブルを共有します。
- RFCFDG
- 設定されているなら、新しいプロセスは新しいファイル記述子テーブルを持って開始します。 RFFDG とは互いに排他的です。
- RFTHREAD
- 設定されるなら、新しいプロセスは、親と共にリーダテーブルを処理するためにファイル記述子を共有します。 RFFDG も RFCFDG も設定されていないときだけ適用します。
- RFMEM
- 設定されているなら、通常、ハードウェアのページテーブルを直接共有することで、カーネルはアドレス空間全体を強制的に共有します。子は、このような方法で、親プロセスが所有しているすべてのセグメントを、それが普段共有可能であるか否かに関係なく、継承し共有します。スタックセグメントは分割されない (親と子供の両方が同じスタック上に復帰する) ので、RFMEM フラグを指定した rfork() は一般に、C 言語を含む高級言語から直接呼び出すことはできません。共に設定可能なフラグは、 RFPROC だけです。この問題を解決し、提供されたスタック上で新しいプロセスを走らせるために補助関数が提供されています。詳しくは、 rfork_thread(3) を参照してください。多くのコードは、正しくそのような環境で実行しないことに注意してください。
- RFSIGSHARE
- 設定されているなら、カーネルは、親子間で sigacts 構造体を強制的に共有します。
- RFTSIGZMB
- 設定されるなら、カーネルは、デフォルトの SIGCHLD の代わりに子供の終了時に指定されたシグナルを親に配信します。シグナル番号 signum は、 RFTSIGFLAGS(signum) 表現を flags に oring することによって指定されます。訳注: oring は、何か動詞のスペルミスと思われます。シグナル番号 0 を指定すると、子供の終了時のシグナルの配信を無効にします。
- RFLINUXTHPN
- 設定されているなら、カーネルは、子供のスレッド終了時に、 SIGCHILD の代わりに SIGUSR1 を配信します。これは特定の Linux クローン動作を模倣するためです。
共有ファイル記述子テーブル内のファイル記述子は、明示的にクローズされるか、またはテーブルを共有しているすべてのプロセスが終了するまでオープンしたままに保たれます。
RFPROC が設定されているなら、親プロセス内で返される値は、子供のプロセスのプロセス ID です。子供のプロセス内で返される値は、0 です。 RFPROC がない場合、戻り値は、0 です。プロセス ID の範囲は、1 から最大整数値 ( int) です。必要であれば、要求されたプロセスリソースが利用できるようになるまで rfork() システムコールは待機します。
fork() システムコールは、 rfork( RFFDG | RFPROC) への呼び出しとして実装可能ですが、後方互換性のためにそのようには実装されていません。
戻り値
正常に完了した場合、 rfork() は、子供のプロセスに値 0 を返し、子供のプロセスのプロセス ID を親プロセスに返します。そうでないなら、子供のプロセスは作成されずに、値 -1 が親プロセスに返され、エラーを示すためにグローバル変数 errno が設定されます。エラー
rfork() システムコールは、次の場合に処理を失敗し、子供のプロセスは作成されません:- [ EAGAIN]
- 実行中のプロセスの合計数がシステムの課す制限を超過してしまいます。制限は、 sysctl(3) MIB 変数 KERN_MAXPROC によって指定されます (スーパユーザを除いて、制限は実際には、これより 10 個少なくなります)。
- [ EAGAIN]
- ユーザがスーパユーザではなく、1 人のユーザによる実行中のプロセスの合計数がシステムの課した制限を超過してしまいます。制限は、 sysctl(3) MIB 変数 KERN_MAXPROCPERUID によって指定されます。
- [ EAGAIN]
- ユーザがスーパユーザではなく、 resource 引数 RLIMIT_NOFILE に対応するソフトリソースの制限を超過してしまいます ( getrlimit(2) を参照)。
- [ EINVAL]
- RFFDG フラグと RFCFDG フラグの両方が指定されました。
- [ EINVAL]
- これまでに列挙されていないフラグが指定されました。
- [ EINVAL]
- 無効のシグナル番号が指定されました。
- [ ENOMEM]
- 新しいプロセス用に十分なスワップ空間が不足しました。
歴史
rfork() 関数は、Plan9 ではじめて登場しました。July 12, 2011 | FreeBSD |