posix_spawn()
gpt-5.icon
posix_spawn() は、新しいプロセスを生成して指定したプログラムを実行するための POSIX 標準 API です。
何をする関数?
code:c
int posix_spawn(
pid_t *pid,
const char *path,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *attrp,
char *const argv[],
char *const envp[]
);
処理の流れ(内部的イメージ)
1. 子プロセスを生成
2. 必要なら FD 操作(リダイレクト等)
3. 属性を適用
4. path のプログラムを実行
これをカーネル寄りの実装で一気にやるのが特徴です。
なぜ fork()+exec() じゃなくて posix_spawn()?
✅ 軽量・高速
fork() は親プロセスのアドレス空間をコピーします(Copy-on-write とはいえ重い)。
posix_spawn() は多くの OS で
Linux: clone + execve
macOS: カーネル内 spawn
のように最適化されていて、巨大プロセスから子を作るとき特に速い&省メモリ。
✅ マルチスレッド安全
fork() 後、exec() 前の子プロセスでは
mutex
malloc
logging
などほぼ何も安全に呼べません。
posix_spawn() はその危険ゾーンが存在しません。
✅ ファイルディスクリプタ操作を宣言的に書ける
posix_spawn_file_actions_t を使うと:
code:c
posix_spawn_file_actions_adddup2(&actions, fd, STDOUT_FILENO);
みたいに
dup2
close
open
を事前に登録できます。
fork 後にゴリゴリ書く必要なし。
posix_spawn() → フルパス必須
posix_spawnp() → $PATH を検索してくれる(execvp 相当)