rfork(2) FreeBSD 一般コマンドマニュアル

rfork

前のページ 上に戻る 次のページ

rfork




書式

     #include <unistd.h>

     int
     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) です。必要であれ

     [EAGAIN]           実行中のプロセスの合計数がシステムの課す制限を超過して
                        しまいます。制限は sysctl(3) MIB 変数 KERN_MAXPROC に
                        よって指定されます (スーパユーザを除いて、制限は実際に
                        はこれより 1 少なくなります)。

     [EAGAIN]           ユーザがスーパユーザではなく、 1 人のユーザによる実行
                        中のプロセスの合計数がシステムの課した制限を超過してし
                        まいます。制限は、 sysctl(3) MIB 変数
                        KERN_MAXPROCPERUID によって指定されます。

     [EAGAIN]           ユーザがスーパユーザではなく、リソースパラメータ
                        RLIMIT_NOFILE に対応するソフトリソースの制限を超過して
                        しまいます (getrlimit(2) を参照)。

     [EINVAL]           RFPROC フラグが指定されませんでした。

     [EINVAL]           RFFDG フラグと RFCFDG フラグの両方が指定されました。

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


関連項目

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


BUGS

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


歴史

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

FreeBSD 4.4                    January 12, 1996                    FreeBSD 4.4

ABELNET VPSサービス