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 サブルーチンは、指定されたプロセス・イメージから新規プロセス (子プロセス) を作成します。 新規プロセス・イメージは、 新規プロセス・イメージ・ファイルと呼ばれる通常の実行可能ファイルから構成されます。

この呼び出しの結果として C プログラムが実行されると、プログラムは次のように C 言語の関数呼び出しとして入力されます。
int main(int argc, char *argv[]);
ここで、 argc は引数カウント、 argv は引数自体への文字ポインターの配列です。 さらに、次の変数を見てみましょう。
extern char **environ;
上記の変数は、環境ストリングの文字ポインターの配列のポインターとして、初期設定されます。

argv パラメーターは、ヌル終了ストリングを指す文字ポインターの配列です。 この配列の最後のメンバーは NULL ポインターであり、 argcではカウントされません。 これらのストリングは、新規プロセス・イメージで使用可能な引数リストを構成します。 argv[0] の値は、 posix_spawn または posix_spawnp 関数によって開始されるプロセス・イメージに関連付けられたファイル名を指している必要があります。

引数 envp は、ヌル終了ストリングを指す文字ポインターの配列です。 これらのストリングは、新規プロセス・イメージの環境を構成します。 環境配列はヌル・ポインターで終了します。

子プロセスの引数リストと環境リストの組み合わせで使用可能なバイト数は、 {ARG_MAX}です。 このインプリメンテーションでは、長さワード、ヌル終了文字、ポインター、または位置合わせバイトなどのリスト・オーバーヘッドをこの合計に含めるかどうかをシステム文書に指定します。

posix_spawn の path 引数は、実行する新規プロセス・イメージ・ファイルを識別するパス名です。

posix_spawnp のファイル・パラメーターは、新規プロセス・イメージ・ファイルを識別するパス名を構成するために使用されます。 ファイル・パラメーターにスラッシュ文字 (/) が含まれている場合、ファイル・パラメーターが新規プロセス・イメージ・ファイルのパス名として使用されます。 それ以外の場合、このファイルのパス接頭部は、環境変数 PATHとして渡されるディレクトリーの検索によって取得されます。 この環境変数が定義されていない場合、検索の結果は実装によって定義されます。

file_actions が NULL ポインターの場合、呼び出しプロセスでオープンされているファイル記述子は、 FD_CLOEXEC フラグが設定されているものを除き、子プロセスでオープンのままになります。 オープンのままになっているファイル記述子の場合、対応するオープン・ファイル記述のすべての属性 (ファイル・ロックを含む) は変更されません。

file_actions が NULL ポインターでない場合、子プロセスでオープンされるファイル記述子は、 file_actions が指す spawn ファイル・アクション・オブジェクト、および spawn ファイル・アクションが処理された後の残りの各オープン・ファイル記述子の FD_CLOEXEC フラグによって変更された、呼び出しプロセスでオープンされたファイル記述子になります。 spawn ファイル・アクションの有効な処理順序は次のとおりです。
  1. 子プロセスのオープン・ファイル記述子のセットは、最初は呼び出しプロセスのためにオープンされているものと同じセットです。 対応するオープン・ファイル記述のすべての属性 (ファイル・ロックを含む) は、変更されません。
  2. シグナル・マスク・シグナルのデフォルト・アクション、および子プロセスの有効なユーザー ID とグループ ID は、 attrpによって参照される属性オブジェクトの指定に従って変更されます。
  3. spawn ファイル・アクション・オブジェクトによって指定されたファイル・アクションは、spawn ファイル・アクション・オブジェクトに追加された順序で実行されます。
  4. FD_CLOEXEC フラグが設定されているファイル記述子はすべてクローズされます。
posix_spawnattr_t spawn 属性オブジェクト・タイプは、 spawn.h ヘッダー・ファイルで定義されます。 その属性は、以下のように定義されます。
  • POSIX_SPAWN_SETPGROUP フラグが attrpによって参照されるオブジェクトの spawn-flags 属性で設定され、同じオブジェクトの spawn-pgroup 属性がゼロ以外の場合、子のプロセス・グループは、 attrpによって参照されるオブジェクトの spawn-pgroup 属性で指定されたとおりになります。
  • 特殊なケースとして、 attrpによって参照されるオブジェクトの spawn-flags 属性に POSIX_SPAWN_SETPGROUP フラグが設定され、同じオブジェクトの spawn-pgroup 属性が 0に設定されている場合、子は、プロセス・グループ ID がプロセス ID に等しい新規プロセス・グループに入ります。
  • attrpによって参照されるオブジェクトの spawn-flags 属性に POSIX_SPAWN_SETPGROUP フラグが設定されていない場合、新しい子プロセスは親のプロセス・グループを継承します。
  • POSIX_SPAWN_SETSCHEDPARAM フラグが attrpによって参照されるオブジェクトの spawn-flags 属性に設定されているが、 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 ポインターによって参照されるオブジェクトの spawn-flags 属性に POSIX_SPAWN_NO_SHM フラグが設定されている場合、新しいプロセス・イメージは共有メモリーを継承しません。
  • attrp ポインターの値が NULL の場合は、デフォルト値が使用されます。
前のリストの attrp で参照されるオブジェクトに設定された属性、または file_actionsで指定されたファイル記述子操作によって設定された属性の影響を除くすべてのプロセス属性は、子プロセスを作成するために fork が呼び出され、次に exec ファミリーの関数のメンバーが呼び出されたかのように、新規プロセス・イメージに表示されます。

file_actions および attrp ポインターが NULLの場合、新規プロセスを作成する前に fork ハンドラーは呼び出されません。 また、 spawn-flags 属性に POSIX_SPAWN_NO_FORK_HANDLERS フラグが指定されていて、 POSIX_SPAWN_FORK_HANDLER フラグが指定されていない場合も、fork ハンドラーは呼び出されません。 それ以外の場合は、fork ハンドラーが呼び出されます。

戻り値

正常に完了すると、 posix_spawn および posix_spawnp は、NULL 以外の pid 引数が指す変数で子プロセスのプロセス ID を親プロセスに戻し、関数の戻り値として 0 を戻します。 それ以外の場合、子プロセスは作成されず、非 NULL pid によって指し示される変数に保管される値は指定されず、エラーを示す関数戻り値としてエラー番号が戻されます。 pid 引数が NULL ポインターの場合、子のプロセス ID は呼び出し元に戻されません。

エラー・コード

以下の条件が当てはまる場合、 posix_spawn および posix_spawnp サブルーチンは失敗します。
表 1. エラー・コード
項目 説明
EINVAL file_actions または attrp によって指定された値は無効です。
posix_spawn および posix_spawnp サブルーチンのエラー・コードは、以下の条件の影響を受けます。
  • 呼び出しプロセスが posix_spawn または posix_spawnp 関数から正常に戻った後にこのエラーが発生した場合、子プロセスは終了状況 127で終了する可能性があります。
  • fork または exec 関数ファミリーのいずれかが失敗する原因となるいずれかの理由で posix_spawn または posix_spawnp が失敗した場合、それぞれ 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で子プロセス sexit が戻されます)。
  • attrpによって参照されるオブジェクトの spawn-flags 属性に POSIX_SPAWN_SETSCHEDULER が設定されていて、 sched_setscheduler が失敗する原因となるいずれかの理由で posix_spawn または posix_spawnp が失敗した場合、 sched_setscheduler の説明に従ってエラー値が戻されます (または、呼び出しプロセスが正常に戻った後にエラーが発生した場合、子プロセスは終了状況 127で終了します)。
  • file_actions 引数が NULL ではなく、実行する closedup2、または open アクションを指定しており、 closedup2、または open の失敗の原因となるいずれかの理由で posix_spawn または posix_spawnp が失敗した場合、それぞれ closedup2、および openで説明されているエラー値が戻されます (または、呼び出しプロセスが正常に戻った後にエラーが発生した場合)。 子プロセスは終了状況 127で終了します。 オープン・ファイル・アクション自体は、 openで説明されているエラーに加えて、 close または dup2で説明されているエラーのいずれかになる可能性があります。