スポンサーリンク

RFORK(2) FreeBSD システムコールマニュアル RFORK(2)

名称

rfork − プロセスリソースの操作

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <unistd.h>

pid_t

rfork(int flags);

解説

fork, vfork, rfork は、新しいプロセスが作成される唯一の方法です。 rfork() への引数 flags は、起動しているプロセス (親) のどのリソースが新しいプロセ ス (子) によって共有されるか、またはそれらのデフォルト値に初期化されるか を選択します。リソースにはオープンファイル記述子テーブル (これは、共有さ れる場合、プロセスが他のプロセスについてファイルを開閉することを許容しま す) およびオープンファイルが含まれます。 flags 引数は次の項目の論理和 (OR) です:

       RFPROC

設定されている場合、新しいプロセスが作成されます。そうでない 場合、変更が現在のプロセスに影響を及ぼします。

RFNOWAIT
設定されている場合、子プロセスは親プロセスから分離されます。 終了時に、子プロセスは、親プロセスが集めるステータスを残しま せん。 wait(2) を参照してください。

RFFDG
設定されている場合、起動側のファイル記述子テーブル (intro(2) を参照) がコピーされます。そうでない場合、2 つのプロセスが 1 つのテーブルを共有します。

RFCFDG
設定されている場合、新しいプロセスは新しいファイル記述子テー ブルを持って開始します。 RFFDG とは互いに排他的です。

RFMEM
設定されている場合、通常、ハードウェアのページテーブルを直接 共有することで、カーネルはアドレス空間全体を強制的に共有しま す。子は、このような方法で、親プロセスが所有しているすべての セグメントを、それが普段共有可能であるか否かに関係なく、継承 し共有します。スタックセグメントは分割されない (親と子の両方 が同じスタック上に復帰する) ので、RFMEM フラグを指定した rfork() は一般に、C 言語を含む高級言語から直接呼び出すことは できません。共に設定可能なフラグは RFPROC だけです。この問題 を解決し、提供されたスタック上で新しいプロセスを走らせるため に補助関数が提供されています。詳しくは rfork_thread(3) を参 照してください。

RFSIGSHARE
設定されている場合、カーネルは、親子間で sigacts 構造体を強 制的に共有します。

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]
これまでに列挙されていないフラグが指定されました。

[ENOMEM]
新しいプロセス用に十分なスワップ空間が不足しました。

関連項目

fork(2), intro(2), minherit(2), vfork(2), rfork_thread(3)

バグ

FreeBSD では、ネイティブな clone() ライブラリコールは未だに実装されていま せんし、現在の pthreads 実装は RFMEM を指定した rfork() を利用していませ ん。 linux スレッドライブラリのネイティブポートである、 /usr/ports/devel/linuxthreads は RFMEM を利用して動作する clone() 呼び出 しを含んでいます。 rfork_thread(3) 関数は clone() の代わりとして利用する ことができます。

歴史

rfork() 関数は Plan9 ではじめて登場しました。

FreeBSD 10.0 January 31, 2003 FreeBSD 10.0

スポンサーリンク