4

質問はタイトルです。'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は「execls」の文字列になります。3行目で子プロセスがフォークされています。5行目では、exec(cmd)が子プロセスを置き換えますが、親プロセスには影響しません。父親のプロセスが影響を受けない場合、なぜターミナルがシャットダウンするのですか?

上記の私の推論の欠陥を見せてください。

4

3 に答える 3

6

を実行するlsと、シェルプロセスはプログラムを実行するために別のlsプロセスを起動し、プログラムが終了するのを待ちます。終了すると、制御はシェルに戻ります。

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

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

(非常勤)の状況の説明については、この回答を参照してください。shell/ls


更新に関しては、シェルが何かを行うための別個のプロセスを常に作成するとは限りません他のプロセスの作成を伴わない内部コマンド(cdまたはなど)は多数あります(これはもちろんシェルによって異なりますが、一例として、コマンドプロンプトで入力すると内部コマンドを表示できます)。aliasbashman bash-builtins

execこれらの1つです。シェル自体(つまり、フォークされた子プロセスではない)を指定したプログラムに置き換えるだけです。そのため、思ったとおりに動作しません。

于 2013-01-28T03:11:42.053 に答える
3

Execは、現在のプロセスを別のプロセスでオーバーライドします。通常、「ls」を呼び出すと、シェルの子として実行される新しいプロセスが作成されます。「execls」は、「ls」プロセスで現在のシェルをオーバーライドします。したがって、「ls」が終了するとすぐに端末が閉じます。

于 2013-01-28T03:10:26.000 に答える
2

exec実行中のプロセスを新しいプロセスイメージで上書きします。したがって、現在のプロセスでは、実行中のシェルがls実行可能イメージによって上書きされ、ls終了するとプロセスがシャットダウンされます。

于 2013-01-28T03:10:07.050 に答える