double-forkその後
ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
forkの箇所を読み返したら、double-forkについて一言だけ触れてた。前読んだときには完全にスルーしてたっぽい。
どんな感じかなと思って、サンプルプログラムをいじってdouble-forkするプログラムを走らせてみた。すると、子プロセスからforkされた孫プロセスでexeclしたプロセスは、親プロセスがinitになってた。これがdouble-fork、てことでいいのかなあ。もっと突っ込んだ本を読みたくなる。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]){ pid_t pid1, pid2; if(argc != 3){ fprintf(stderr, "Usage: %s <command> <argv>\n", argv[0]); exit(1); } if((pid1 = fork()) < 0){ /* 子プロセスをfork */ fprintf(stderr, "fork(2)-1 failed\n"); exit(1); } if(pid1 == 0){ if((pid2 = fork()) < 0){ /* 孫プロセスをfork */ fprintf(stderr, "fork(2)-2 failed\n"); exit(1); } if(pid2 == 0){ execl(argv[1], argv[1], argv[2], NULL); /* 第2引数で渡したコマンドを実行 */ perror(argv[1]); exit(99); } } }