execlは、実行されているプロセスを指定の実行ファイルを実行してそのプロセスに置き換えるライブラリ関数・・・。
execlを含むこれらはexecファミリーと呼ばれる・・・。
execl_mainからexeclでexecl_subを実行し、execl_mainのプロセスはexecl_subに置き換わる・・・。
execl_main.cは、
getpidで自分のプロセスIDを取得し、sleepで60秒待つ・・・。
60秒経ったら、execlでexecl_subを実行する・・・。
その時に、実行パラメータとして、実行ファイル名"./execl_sub", "123", "abc", "xyz"も渡す・・・。
パラメータの最後にはNULLを指定する・・・。
このあとは、実行先のexecl_subに置き換わるので、"execl after."は出力されない・・・。
execl_sub.cは、
getpidでプロセスIDを取得し、渡された実行パラメータを出力・・・。
60秒後に終了・・・。
execl_mainを実行すると、
$ ./execl_main pid = 20902
プロセスIDは20902・・・。
この間に、もう一個ターミナルを起動・・・。
$ ps all | grep execl 0 1000 20902 20798 20 0 4116 468 hrtime S+ pts/0 0:00 ./execl_main 0 1000 20904 20867 20 0 112608 1016 pipe_w S+ pts/1 0:00 grep --color=auto execl $
確かにexecl_mainは20902だ・・・。
で60秒待つと、
execl before. pid = 20902 argv[0] = ./execl_sub argv[1] = 123 argv[2] = abc argv[3] = xyz
execlでexecl_subが実行される・・・。
このpidはexecl_subでgetpid()したもので、
$ ps all | grep execl 0 1000 20902 20798 20 0 4116 464 hrtime S+ pts/0 0:00 ./execl_sub 123 abc xyz 0 1000 20907 20867 20 0 112592 980 - R+ pts/1 0:00 grep --color=auto execl $
確かにexecl_subが20902であることがわかる・・・。
つまり、execl_mainがexecl_subに置き換わったということ・・・。
Sample/execl_main.c at master · bg1bgst333/Sample · GitHub
Sample/execl_sub.c at master · bg1bgst333/Sample · GitHub