posix_spawn または posix_spawnp サブルーチン
目的
プロセスを作成します。
構文
int posix_spawn(pid_t *restrict pid, const char *restrict path,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict], char *const envp[restrict]);
int posix_spawnp(pid_t *restrict pid, const char *restrict file,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict], char * const envp[restrict]);
説明
posix_spawnと 'posix_spawnpサブルーチンは、指定されたプロセスイメージから新しいプロセス(子プロセス)を生成する。 新しいプロセス・イメージは、新しいプロセス・イメージ・ファイルと呼ばれる通常の実行可能ファイルから構築される。
int main(int argc, char *argv[]);この場合、argc は引数カウント、argv は
引数そのものを指す文字ポインターの配列です。 さらに、次の変数を見てみましょう。extern char **environ;
上記の変数は、環境ストリングの文字ポインターの配列のポインターとして、初期設定されます。argvパラメータは、ヌル終端文字列への文字ポインタの配列である。 この配列の最後のメンバーはヌル・ポインターであり、argcにはカウントされない。 これらのストリングは、新規プロセス・イメージで使用可能な引数リストを構成します。 argv[0]の値は、'posix_spawnまたは'posix_spawnp関数によって開始されるプロセスイメージに関連するファイル名を指すべきである。
引数envpはヌル終端文字列への文字ポインタの配列である。 これらのストリングは、新規プロセス・イメージの環境を構成します。 環境配列はヌル・ポインターで終了します。
子プロセスの引数リストと環境リストを合わせたバイト数は{ARG_MAX}である。長さワード、NULLターミネータ、ポインタ、アラインメントバイトなどのリストのオーバーヘッドがこの合計に含まれるかどうかは、実装がシステム文書で指定する。
posix_spawnpath引数は、実行する新しいプロセス・イメージ・ファイルを特定するパス名である。
posix_spawnpの file パラメータは、新しいプロセス・イメージ・ファイルを識別するパス名を作成するために使用される。 file パラメーターにスラッシュ文字(/)が含まれている場合、file パラメーターは新しいプロセス・イメージ・ファイルのパス名として使用されます。 そうでない場合、このファイルのパスプレフィックスは、環境変数 'PATH として渡されたディレクトリを検索して得られる。 この環境変数が定義されていない場合、検索の結果は実装によって定義されます。
file_actionsがNULLポインタの場合、呼び出しプロセスでオープンされているファイル記述子は、'FD_CLOEXECフラグが設定されているものを除き、子プロセスでもオープンされたままになる。 オープンのままになっているファイル記述子の場合、対応するオープン・ファイル記述のすべての属性 (ファイル・ロックを含む) は変更されません。
- 子プロセスのオープン・ファイル記述子のセットは、最初は呼び出しプロセスのためにオープンされているものと同じセットです。 対応するオープン・ファイル記述のすべての属性 (ファイル・ロックを含む) は、変更されません。
- シグナルマスク、シグナルのデフォルトアクション、子プロセスの有効ユーザーIDおよびグループIDは、attrpによって参照されるattributesオブジェクトで指定されるように変更される。
- spawn file actionsオブジェクトによって指定されたファイルアクションは、spawn file actionsオブジェクトに追加された順に実行されます。
- FD_CLOEXECフラグが設定されているファイル記述子はすべて閉じられる。
- attrp が参照するオブジェクトの 'spawn-flags属性に 'POSIX_SPAWN_SETPGROUPフラグが設定され、 同じオブジェクトの 'spawn-pgroup属性が 0 でない場合、子のプロセスグループはattrp が参照するオブジェクトの 'spawn-pgroup属性で指定されたとおりになる。
- 特殊なケースとして、attrpによって参照されるオブジェクトの'spawn-flags属性に 'POSIX_SPAWN_SETPGROUPフラグが設定され、同じオブジェクトの'spawn-pgroup属性に'
0が設定されている場合、その子はプロセスIDと同じプロセスグループIDを持つ新しいプロセスグループに属する。 - attrp が参照するオブジェクトの 'spawn-flags属性に 'POSIX_SPAWN_SETPGROUPフラグが設定されていない場合、 新しい子プロセスは親のプロセスグループを継承する。
- attrp が参照するオブジェクトの spawn-flags 属性に 'POSIX_SPAWN_SETSCHEDPARAMフラグが設定され、 'POSIX_SPAWN_SETSCHEDULERが設定されていない場合、 新しいプロセスイメージは、attrp が参照するオブジェクトの 'spawn-schedparam属性で指定されたスケジューリングパラメータを持つ呼び出しプロセスのスケジューリングポリシーを最初に持つ。
- attrpが参照するオブジェクトの'spawn-flags属性に'POSIX_SPAWN_SETSCHEDULERフラグが設定されている場合('POSIX_SPAWN_SETSCHEDPARAMフラグの設定に関係なく)、新しいプロセスイメージは、attrpが参照するオブジェクトの'spawn-schedpolicy属性で指定されたスケジューリングポリシーと、同じオブジェクトの'spawn-schedparam属性で指定されたスケジューリングパラメータを最初に持つ。
- attrpによって参照されるオブジェクトの'spawn-flags属性の'POSIX_SPAWN_RESETIDSフラグは、子プロセスの実効ユーザーIDを管理する。 このフラグが設定されていない場合、子プロセスは親プロセスの実効ユーザー ID を継承します。 このフラグが設定されている場合、子プロセスの実効ユーザー ID は親の実ユーザー ID にリセットされます。 いずれの場合も、新しいプロセス・イメージ・ファイルの set-user-ID モード・ビットが設定されていると、新しいプロセス・イメージの実行が開始される前に、子プロセスの実効ユーザー ID がそのファイルの所有者 ID になります。
- attrpによって参照されるオブジェクトの'spawn-flags属性の'POSIX_SPAWN_RESETIDSフラグも、子プロセスの実効グループIDを管理する。 このフラグが設定されていない場合、子プロセスは親プロセスの実効グループ ID を継承します。 このフラグが設定されている場合、子プロセスの実効グループ ID は親の実グループ ID にリセットされます。 いずれの場合も、新しいプロセス・イメージ・ファイルの set-group-ID モード・ビットが設定されていると、新しいプロセス・イメージの実行が開始される前に、子プロセスの実効グループ ID がそのファイルのグループ ID になります。
- attrpによって参照されるオブジェクトの'spawn-flags属性に'POSIX_SPAWN_SETSIGMASKフラグが設定されている場合、子プロセスはattrpによって参照されるオブジェクトの'spawn-sigmask属性で指定されたシグナルマスクを最初に持つ。
- attrpによって参照されるオブジェクトの'spawn-flags属性に'POSIX_SPAWN_SETSIGDEFフラグが設定されている場合、同じオブジェクトの'spawn-sigdefault属性で指定されたシグナルは、子プロセスのデフォルトアクションに設定される。 親プロセスのデフォルト・アクションに設定されたシグナルは、子プロセスのデフォルト・アクションに設定されます。 呼び出しプロセスによってキャッチされるように設定された シグナルは、子プロセスのデフォルト・アクションに設定され ます。
- SIGCHLD除き、呼び出しプロセス・イメージによって無視されるように設定されたシグナルは、attrpによって参照されるオブジェクトの'spawn-flags属性に'POSIX_SPAWN_SETSIGDEFフラグが設定され、attrpによって参照されるオブジェクトの'spawn-sigdefault属性にシグナルが示されることによって、 別段の指定がない限り、子プロセスによって無視されるように設定される。
- SIGCHLDシグナルが呼び出し元プロセスで無視されるように設定されている場合、 「SIGCHLDシグナルが子プロセスで無視されるように設定されているか、 デフォルトのアクションに設定されているかは不定である。 これは、attrpによって参照されるオブジェクトの'spawn_flags属性に'POSIX_SPAWN_SETSIGDEFフラグが設定され、attrpによって参照されるオブジェクトの'spawn_sigdefault属性に'SIGCHLDシグナルが示されることによって指定されない限り、真である。
- attrpポインタの値がNULLの場合、デフォルト値が使用される。
デフォルトでは、フォークハンドラは 'posix_spawnまたは 'posix_spawnpルーチンでは実行されない。 フォーク・ハンドラを有効にするには、アトリビュートに「POSIX_SPAWN_FORK_HANDLERSフラグを設定する。
戻り値
成功すると、'posix_spawnと'posix_spawnpは子プロセスのプロセスIDを、NULLでないpid引数で指された変数に格納して親プロセスに返し、関数の戻り値として'0を返す。 そうでない場合、子プロセスは生成されず、NULLでないpidが指す変数に格納される値は指定されず、エラーを示すエラー番号が関数の戻り値として返される。 引数pidがNULLポインタの場合、子のプロセスIDは呼び出し元に返されない。
エラー・コード
| 項目 | 説明 |
|---|---|
| EINVAL | file_actionsまたはattrpで指定された値が無効です。 |
- 呼び出し元プロセスが'posix_spawnまたは'posix_spawnp関数から正常に戻った後にこのエラーが発生した場合、子プロセスは終了ステータス'
127で終了するかもしれない。 - posix_spawnまたは 'posix_spawnp、'forkまたは 'execファミリーの関数のいずれかを失敗させるような 理由で失敗した場合、それぞれ 'forkと 'exec で示されるエラー値が返される (あるいは、呼び出し元のプロセスが正常に戻った後にエラーが発生した 場合、子プロセスは終了ステータス '
127で終了する)。 - attrp で参照されるオブジェクトの 'spawn-flags属性に 'POSIX_SPAWN_SETPGROUPが設定されており、 子プロセスのプロセスグループの変更中に 'posix_spawnまたは 'posix_spawnp失敗した場合、 'setpgidで示されるエラー値が返される (呼び出し元のプロセスが正常に戻った後にエラーが発生した場合は、 子プロセスは終了ステータス '
127で終了する)。 - POSIX_SPAWN_SETSCHEDPARAMが設定され、attrp が参照するオブジェクトの 'spawn-flags属性に 'POSIX_SPAWN_SETSCHEDULERが設定されていない場合、 'sched_setparamが失敗するような理由で 'posix_spawnまたは 'posix_spawnp失敗すると、 'sched_setparamに記述されたエラー値が返される (呼び出し元のプロセスが正常に戻った後にエラーが発生した場合は、 子プロセスは終了ステータス '
127で終了する)。 - POSIX_SPAWN_SETSCHEDULERがattrp で参照されるオブジェクトの 'spawn-flags属性に設定されており、 'posix_spawnまたは 'posix_spawnp'sched_setschedulerを失敗させるような理由で失敗した場合、 'sched_setschedulerに記述されているエラー値が返される (または、呼び出し元のプロセスが正常に戻った後にエラーが発生した場合、 子プロセスは終了ステータス '
127で終了する)。 - 引数file_actionsが NULL ではなく、かつ実行するアクションとして 'close 、 'dup2 、または 'openを指定し、かつ 'posix_spawnまたは 'posix_spawnp'close 、 'dup2 、または 'openを失敗させるような理由で失敗した場合、それぞれ 'close 、 'dup2 、および 'open で記述されるエラー値が返される (または、呼び出し元のプロセスが正常に戻った後にエラーが発生した場合、子プロセスは終了ステータス '
127で終了する)。 ファイルを開くアクションは、それ自体で、'closeまたは 'dup2 に記述されたエラーに加えて、'open に記述されたエラーのいずれかを引き起こすかもしれない。