fork、f_fork、または vfork サブルーチン
目的
新規プロセスを作成します。
ライブラリー
fork、 f_fork、および vfork: 標準 C ライブラリー (libc.a)
構文
#include <unistd.h> pid_t fork(void) pid_t f_fork(void) int vfork(void)説明
forkサブルーチンは新しいプロセスを作成する。 新規プロセス (子プロセス) は、呼び出しプロセス (親プロセス) のほぼ正確なコピーです。 子プロセスは、親プロセスから以下の属性を継承します。
- 環境
- 終了時のクローズフラグ(execサブルーチンに記述されている)
- 信号処理設定(SIG_DFL値、 SIG_IGN値、Function Addressパラメータなど)
- ユーザーIDモードビットを設定
- グループIDモードビットを設定
- プロファイリングのオンとオフの状態
- 良い値
- アタッチされているすべての共有ライブラリ
- プロセスグループ ID
- ttyグループID(exit、atexit、または_exitサブルーチン、signalサブルーチン、およびraiseサブルーチンに記述されている)
- 現在のディレクトリ
- ルート・ディレクトリー
- ファイルモード作成マスク(umaskサブルーチンに記述されている)
- ファイルサイズの制限(ulimitサブルーチンで説明されている)
- 付属の共有メモリーセグメント(shmatサブルーチンで説明されている)
- マップされたファイルセグメントを添付(shmatサブルーチンに記述)
- 親プロセスでマルチプロセスデバッグが有効になっている場合は、デバッガプロセスIDとマルチプロセスフラグ(ptraceサブルーチンで説明)。
子プロセスは、以下の点で親プロセスと異なります。
- フォーク 子プロセスにはユーザースレッドが1つしかない。
- 子プロセスは一意のプロセスIDを持つ。
- 子プロセスIDが、アクティブなプロセス・グループIDに一致しない。
- 子プロセスの親プロセスIDが異なる。
- 子プロセスは、親プロセスのファイル・ディスクリプタの独自のコピーを持っている。 ただし、子プロセスの各ファイル記述子は、親プロセスの対応するファイル記述子と共通ファイル・ポインターを共有します。
- すべてのsemadj値がクリアされる。 semadj値については、semopサブルーチンを参照のこと。
- プロセス・ロック、テキスト・ロック、データ・ロックは子プロセスには継承されない。 ロックについては、plockサブルーチンを参照のこと。
- トレース マルチプロセスデバッグがオンの場合、'トレースフラグは親から継承される。 リクエスト0については、ptraceサブルーチンを参照のこと。
- 子プロセスのutime、stime、 cutime、cstimeサブルーチンが0に設定される。 (詳細については、getrusage、times、vtimesサブルーチンを参照のこと)
- 保留中のアラームは子プロセスでクリアされる。 (詳細は、incinterval、setitimer、alarmサブルーチンを参照のこと)
- 子プロセスが保留しているシグナルの集合は、空集合に初期化される。
- 子プロセスは親プロセスのメッセージ・カタログのコピーを持つことができる。
注意Xウィンドウシステム、Xツールキット、またはMotifアプリケーションでforkまたはvforkサブルーチンを使用する場合は、フォークされたプロセス用に別のディスプレイ接続(ソケット)を開いてください。 子プロセスが親プロセスと同じディスプレイ接続を使用する場合、Xサーバーは結果のデータを解釈できない。
f_fork サブルーチンは フォークと似ていますが、以下の点が異なります。
- 子プロセスは、作成された直後に EXEC 関数の 1 つを呼び出す必要があります。 フォークハンドラは決して呼び出されないので、アプリケーションデータ、ミューテックス、ロックはすべて子プロセスでは未定義である。
vforkサブルーチンは、古い Berkeley Software Distribution (BSD) システムプログラムの互換インターフェイスとしてサポートされており、Berkeley Compatibility Librarylibbsd.a) を使ってコンパイルすることで使用できます。
オペレーティング・システムのバージョン4では、BSDシステムのように、親プロセスは子プロセスが終了するか実行されるまで待つ必要はない。 子プロセスには、 forkサブルーチンと同様に新しいアドレス空間が与えられる。 子プロセスは親のアドレス空間を共有しない。
注意 forkまたはvforkサブルーチンをEnhanced X-Windows、X Toolkit、またはMotifアプリケーションで使用する場合、フォークされたプロセス用に別のディスプレイ接続(ソケット)を開く必要があります。 子プロセスは、親プロセスと同じディスプレイ接続を使用してはならない。 ディスプレイ接続はソケットによって具体化され、ソケットは子プロセスによって継承されます。 複数のプロセスが同じディスプレイ接続に書き込もうとすると、ワード・レベルで X プロトコル・パケットがランダムにインターリービングされます。 結果としてソケットに書き込まれるデータは、有効または未定義の X プロトコル・パケットではなく、X サーバーはそれを解釈できません。
注意 forkおよび vforkサブルーチンはGraphics Libraryアプリケーションで使用できますが、子プロセスはGraphics Libraryサブルーチンを追加コールしてはいけません。 子アプリケーションは、親のグラフィック・ハードウェア・リソースの一部を継承しますが、すべてを継承するわけではありません。 子プロセスによって描画されると、グラフィックス・アダプターまたは拡張 X サーバーがハングするか、予期しない結果が発生してシステムが予測不能な状態になる可能性があります。
追加情報については、 /usr/lpp/GL/README ファイルを参照してください。
戻り値
正常に終了すると、forkサブルーチンは子プロセスに値0を返し、子プロセスのプロセスIDを親プロセスに返す。 そうでない場合は、親プロセスに-1が返され、子プロセスは生成されず、エラーを示すerrnoグローバル変数が設定される。
エラー・コード
以下の1つ以上が真である場合、フォークサブルーチンは失敗する:
| 項目 | 説明 |
|---|---|
| EAGAIN | システム全体または単一のユーザーによって実行されているプロセスの総数の制限を超えるか、システムに別のプロセスを作成するのに必要なリソースがない。 |
| ENOMEM | このプロセスには十分なスペースがありません。 |
| EPROCLIM | WLM が実行されている場合は、クラス内のプロセスまたはスレッドの数の制限が満たされている可能性があります。 |