execl

execlは、実行されているプロセスを指定の実行ファイルを実行してそのプロセスに置き換えるライブラリ関数・・・。

Man page of EXEC

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