1. ホーム
  2. linux

[解決済み] シェルで 'exec ls' を実行すると何が起こるか、またその理由は?[クローズド]。

2022-02-06 18:59:59

質問内容

問題はタイトルです。'ls'を実行した直後にターミナルがシャットダウンする理由がわかりませんでした。Linuxのシェルはこんな感じです。

1.while (1) {.
2. char *cmd = read_command();
3. int child_pid = fork();
4. if (child_pid == 0) {.
5. exec(cmd)を実行します。
6. }else {
7. waitpid(child_pid);
8. }
9.}

つまり、シェルで「exec ls」を実行すると、cmdは「exec ls」の文字列となります。3行目で子プロセスがフォークされています。5行目でexec(cmd)は子プロセスを置き換えますが、親プロセスには影響を与えません。親プロセスに影響がないのであれば、なぜ端末がシャットダウンしてしまうのでしょうか?

上記の私の推論の欠点を教えてください。

解決方法は?

を実行すると ls を実行すると、シェルプロセスが起動します。 もう一つ を実行するためのプロセスです。 ls プログラムを実行し、それが終了するのを待ちます。終了すると、制御はシェルに戻されます。

exec ls であれば、実際に 置き換える のシェルプログラムを 現在 プロセスで ls プログラムが終了したときに、それを待つシェルがないようにします。

ほとんどの場合、ターミナルプログラムまたは init を親として、プロセスが終了したときにそれを引き継ぎます。シェルが消えるのは、あなたが明示的にシェルにそう指示したからです。

参照 この答え の説明については shell/ls (ノンエックス)の状況です。


アップデートの件ですが、シェルが行う ない は、常に別のプロセスを作成して何かを行います。大量の内部コマンド(例えば cd または alias ) で、他のプロセスを作らないもの (もちろん、これはシェルによりますが、一例として bash を入力することで、内部コマンドを実行することができます。 man bash-builtins をコマンドプロンプトで実行)。

exec はその一つです。これは単にシェルそのものを置き換えるものである(つまり ではなく フォークされた子プロセス) を指定されたプログラムに置き換えます。そのため、あなたが考えているような動作はしません。