なぜls
実行に別のプロセスが必要ですか?
cd
のようなコマンドが必要な理由を知っています フォークメカニズムでは実行できませんが、ls
の場合、害はありますか フォークせずに実行されますか?
承認された回答:
答えは多かれ少なかれls
外部実行可能ファイルです。 type -p ls
を実行すると、その場所を確認できます。 。
ls
ではないのはなぜですか シェルに組み込まれていますか?さて、なぜそれが必要なのですか?シェルの役割は、使用可能なすべてのコマンドを網羅することではなく、それらを実行できる環境を提供することです。一部の最新のシェルにはecho
があります 、printf
、およびビルトインとしてのそれらの同類。技術的に 組み込みである必要がありますが、繰り返し実行される場合(主にタイトループで)のパフォーマンス上の理由から組み込まれています。それらを組み込みにしないと、シェルはそれらを呼び出すたびに新しいプロセスをフォークして実行する必要があり、これは非常に遅くなる可能性があります。
少なくとも、ls
を実行する 、外部実行可能ファイルは、システムコールのexecファミリの1つを実行する必要があります。あなたはできた フォークせずにこれを行いますが、使用しているプライマリシェルが置き換えられます。次の手順を実行すると、そのインスタンスで何が起こるかを確認できます。
exec ls; echo "this never gets printed"
シェルのプロセスイメージが置き換えられたため、これを行うと現在のシェルにアクセスできなくなります。 lsを実行した後もシェルを実行し続けるには、コマンドをシェルに組み込む必要があります。
フォークを使用すると、プライマリシェルではないプロセスを置き換えることができます。つまり、後でシェルを実行し続けることができます。