EN JA
POSIX_SPAWN(3)
POSIX_SPAWN(3) FreeBSD Library Functions Manual POSIX_SPAWN(3)

名称

posix_spawn, posix_spawnpプロセスをスポンする

ライブラリ

Standard C Library (libc, -lc)

書式

#include < spawn.h>

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 は、ヌル文字で終了する文字列への文字ポインタの配列です。これらの文字列は、新しいプロセスイメージのための環境を構成します。環境配列は、 NULL ポインタによって終了されます。

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

posix_spawnp() への file パラメータは、新しいプロセスイメージファイルを識別するパス名を構成するために使用されます。ファイルパラメータがスラッシュ文字を含んでいるなら、ファイルパラメータは、新しいプロセスイメージファイルにパス名として使用されます。そうでなければ、このファイルのためのパス接頭辞は、環境変数“ PATH”として渡されたディレクトリの検索によって取得されます。この変数が指定されないなら、デフォルトのパスは、“ /usr/bin:/bin”に設定された < paths.h>_PATH_DEFPATH 定義にしたがって設定されます。

file_actions が NULL ポインタであるなら、呼び出しプロセスでオープンされているファイル記述子は、close-on-exec フラグ FD_CLOEXEC が設定されている ( fcntl() 参照) いるものを除いて、子プロセスでオープンされたままで残ります。オープンしているままのそれらのファイル記述子について、対応するオープンファイル記述子のすべての属性は、ファイルロック ( fcntl() 参照) を含んで、変更しないままとなります。

file_actions が NULL でないなら、子プロセスでオープンされたファイル記述子は、 file_actions によって指されるスポンファイルアクションオブジェクトによって変更され、スポンファイルアクションが処理された後に、それぞれの残っているオープンされたファイル記述子の FD_CLOEXEC フラグとして、呼び出しプロセスでオープンされたものです。スポンファイルアクションを処理する効果的な順序は、次の通りです:

  1. 最初に、子プロセスのためのオープンファイル記述子のセットは、呼び出しプロセスのためにオープンされたものと同じセットです。対応するオープンされたファイル記述子のすべての属性は、ファイルロック ( fcntl() 参照) を含んで、変更しないままとなります。
  2. 子プロセスのためのシグナルマスク、シグナルのデフォルトアクション、実効ユーザ、とグループ ID は、 attrp によって参照される属性オブジェクトで指定されるように変更されます。
  3. スポンファイルアクションオブジェクトによって指定されたファイルアクションは、それらがスポンファイルアクションオブジェクトに追加された順序で実行されます。
  4. FD_CLOEXEC フラグ設定 ( fcntl() 参照) がある任意のファイル記述子は、クローズされます。

posix_spawnattr_t スポン属性オブジェクトタイプは、 < spawn.h> に定義されています。それは、下記に定義された属性を含んでいます。

POSIX_SPAWN_SETPGROUP フラグが attrp によって参照されたオブジェクトの spawn-flags 属性で設定され、同じオブジェクトの spawn-pgroup 属性が 0 でないなら、子供のプロセスグループは、 attrp によって参照されたオブジェクトの spawn-pgroup 属性で指定されるものです。

特別なものとして、 POSIX_SPAWN_SETPGROUP フラグが attrp によって参照されたオブジェクトの spawn-flags 属性で設定され、同じオブジェクトの spawn-pgroup 属性が 0 に設定されているなら、子供のプロセスは、そのプロセス ID と等しいプロセスグループ ID で新しいプロセスグループとなります。

POSIX_SPAWN_SETPGROUP フラグが attrp によって参照されたオブジェクトの spawn-flags 属性で設定されていないなら、新しい子プロセスは、親のプロセスグループを継承します。

POSIX_SPAWN_SETSCHEDPARAM フラグが attrp によって参照されたオブジェクトの spawn-flags 属性で設定されていますが、 POSIX_SPAWN_SETSCHEDULER が設定されていないなら、最初に、新しいプロセスイメージには、 attrp によって参照されたオブジェクトの spawn-schedparam 属性で指定されたスケジューリングパラメータで呼び出しプロセスのスケジューリングポリシがあります。

POSIX_SPAWN_SETSCHEDULER フラグが ( POSIX_SPAWN_SETSCHEDPARAM フラグの設定にかかわらず) attrp によって参照されたオブジェクトの spawn-flags 属性で設定されているなら、最初に、新しいプロセスイメージには、 attrp によって参照されたオブジェクトの spawn-schedpolicy 属性で指定されたスケジューリングポリシと同じオブジェクトの spawn-schedparam 属性で指定されたスケジューリングパラメータがあります。

attrp によって参照されたオブジェクトの spawn-flags 属性の POSIX_SPAWN_RESETIDS フラグは、子プロセスの実効ユーザ ID を支配します。このフラグが設定されていないなら、子プロセスは、親プロセスの実効ユーザ ID を継承します。このフラグが設定されているなら、子プロセスの実効ユーザ ID は、親の実ユーザ ID にリセットされます。どちらの場合にも、新しいプロセスイメージファイルのセットユーザ ID (set-user-ID) が設定されているなら、新しいプロセスイメージが実行を始める前に、子プロセスの実効ユーザ ID は、そのファイルの所有者の ID になります。

また、 attrp によって参照されたオブジェクトの spawn-flags 属性の POSIX_SPAWN_RESETIDS フラグは、子プロセスの実効グループ ID を支配します。このフラグが設定されていないなら、子プロセスは、親プロセスの実効グループ ID を継承します。このフラグが設定されているなら、子プロセスの実効グループ ID は、親の実グループ ID にリセットされます。どちらの場合にも、新しいプロセスイメージファイルのセットグループ ID (set-group-ID) モードビットが設定されているなら、新しいプロセスイメージが実行を始める前に、子プロセスの実効グループ ID は、そのファイルのグループ ID になります。

POSIX_SPAWN_SETSIGMASK フラグが attrp によって参照されたオブジェクトの spawn-flags 属性で設定されているなら、最初に、子プロセスには、 attrp によって参照されたオブジェクトの spawn-sigmask 属性で指定されたシグナルマスクがあります。

POSIX_SPAWN_SETSIGDEF フラグが attrp によって参照されるオブジェクトの spawn-flags 属性で設定されるなら、同じオブジェクトの spawn-sigdefault 属性で指定されたシグナルは、子プロセスのそれらのデフォルトアクションに設定されます。親プロセスのデフォルトアクションへのシグナルセットは、子プロセスのデフォルトアクションに設定されます。

呼び出しプロセスによって獲得されるシグナルセットは、子プロセスのデフォルトアクションに設定されます。

呼び出しプロセスイメージによって無視されるシグナルセットは、そうでなければ、 attrp によって参照されたオブジェクトの spawn-flags 属性で設定されている POSIX_SPAWN_SETSIGDEF フラグと、 attrp によって参照されるオブジェクトの spawn-sigdefault 属性で示されているシグナルによって指定さないなら、子プロセスによって無視されるように設定されます。

attrp ポインタの値が NULL であるなら、デフォルト値が、使用されます。

上記で指定されるような attrp によって参照されたオブジェクトに設定された属性によって、または file_actions で指定されたファイル記述子操作によって、影響されたもの以外のすべてのプロセス属性は、まるで vfork() が、子プロセスを作成するために呼び出され、次に、 execve() が、新しいプロセスイメージを実行するための子プロセスによって呼び出されるかのように新しいプロセスイメージに現れます。

したがって、vfork() を使用する実装では、fork ハンドラは、 posix_spawn() または posix_spawnp() が呼び出されるとき、実行されません。

戻り値

成功して終了すれば、 posix_spawn() と posix_spawnp() は、NULL でない pid 引数によって指された変数に、親プロセスへの子プロセスのプロセス ID を返し、関数の返り値として 0 を返します。そうでなければ、子プロセスは、作成されず、値は、 pid によって指された変数に格納されません、そして、エラー番号は、エラーを示すために関数の返り値として返されます。 pid 引数が NULL ポインタであるなら、子供のプロセス ID は、呼び出し側に返されません。

エラー

  1. posix_spawn() と posix_spawnp() は、 vfork() を引き起こす理由のどれかで失敗するか、または、 exec の 1 つで失敗し、エラー値は、それぞれ、 vfork() と exec によって記述されるように返されます (または、呼び出しプロセスが成功して戻った後に、エラーが発生するなら、子プロセスは、終了ステータス 127 で終了します)。
  2. POSIX_SPAWN_SETPGROUP が、attrp によって参照されたオブジェクトの spawn-flags 属性で設定され、 posix_spawn() または posix_spawnp() が、子供のプロセスグループを変更しているる間に失敗するなら、エラー値は、 setpgid() によって説明されるように返されます、(または、呼び出しプロセスが成功して返った後にエラーが発生するなら、子プロセスは、終了ステータス 127 で終了します)。
  3. POSIX_SPAWN_SETSCHEDPARAM が設定され、 POSIX_SPAWN_SETSCHEDULER が、 attrp によって参照されたオブジェクトの spawn-flags 属性で設定されていないなら、次に、 posix_spawn() または posix_spawnp() が、 sched_setparam() が失敗する何らかの理由で失敗するなら、エラー値は、 sched_setparam() によって説明されるように返されます、(または、呼び出しプロセスが成功して返った後にエラーが発生するなら、子プロセスは、終了ステータス 127 で終了します)。
  4. POSIX_SPAWN_SETSCHEDULER が attrp によって参照されたオブジェクトの spawn-flags 属性で設定され、 posix_spawn() または posix_spawnp() が、 sched_setscheduler() が失敗する何らかの理由で失敗するなら、エラー値は、 sched_setscheduler() によって説明されるように返されます、 (または、呼び出しプロセスが成功して返った後にエラーが発生するなら、子プロセスは、終了ステータス 127 で終了します)。
  5. file_actions 引数が NULL でなく、実行される任意の dup2 または open アクションを指定して、 posix_spawn() または posix_spawnp() が dup2() または open() が失敗する何らかの理由で失敗するなら、エラー値は、それぞれ dup2() と open() によって説明されるように返され (るか、または、エラーが呼び出しプロセスが成功して返った後に発生するなら、子プロセスは、終了ステータス 127 で終了し) ます。オープンされたファイルアクションは、それ自体によって、 open() によって説明されたものに加えて dup2() によって説明されたエラーのいずれかの結果となります。この実装は、オープンされていない記述子をクローズすることを含んで、 close() からのどんなエラーも無視します。

規格

posix_spawn() と posix_spawnp() 関数は、 close() からのすべてのエラーを無視することを除いて、 IEEE Std 1003.1-2001 (“POSIX.1”) に適合しています。規格の将来の更新は、 ( posix_spawn_file_actions_addclose() を通して) クローズされるファイル記述子がオープンされないので、これらの関数が失敗しないことが期待されます。

歴史

posix_spawn() と posix_spawnp() 関数は、 FreeBSD 8.0 ではじめて登場しました。

作者

Ed Schouten <ed@FreeBSD.org>
June 17, 2011 FreeBSD