シェルから
% ls
とコマンドを実行すると、シェルは以下のことを行う。
- システムコール fork(2) を呼び、子プロセスを生成する。
- 子プロセスは ls を exec(2) する。
- 親プロセスであるシェルは、ls の実行が完了するのを待つ (wait する)。
一方、
% exec ls
と exec を使うと、シェルは fork(2) せず、いきなり ls コマンドを exec(2) する (シェルの内部コマンド exec(1) を実行すると、内部でシステムコール exec(2) が呼ばれるということ)。シェルのプロセス情報は ls のプロセスの情報で上書きされる。なお、子プロセスは生成されないので、シェルと ls のプロセス ID は同じになる。