[解決済み] シェルで 'exec ls' を実行すると何が起こるか、またその理由は?[クローズド]。
質問内容
問題はタイトルです。'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
はその一つです。これは単にシェルそのものを置き換えるものである(つまり
ではなく
フォークされた子プロセス) を指定されたプログラムに置き換えます。そのため、あなたが考えているような動作はしません。
関連
-
[解決済み] DiffコマンドとGrepで "バイナリファイル(標準入力)が一致 "と表示される。
-
[解決済み] あるパターンの前にテキストを追加する際に、大文字小文字を無視してsedを使用する
-
[解決済み] ls: 読み込みディレクトリ .: 入出力エラー [閉じた].
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] time(1) の出力における 'real', 'user' および 'sys' はどのような意味ですか?
-
[解決済み] シェルスクリプトでブール変数を宣言して使用するにはどうすればよいですか?
-
[解決済み] シェルコマンドの実行と出力のキャプチャ
-
[解決済み] を付けるべきでしょうか?(shebang)を付けるべきか、またどのような形で付けるべきか?
-
[解決済み] 何が私のプロセスを殺したのか、なぜなのか?
-
[解決済み] UnixのコンソールやMacのターミナルでシェルスクリプトを実行するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] sysrootとは何ですか、そしてどのように作成しますか?
-
[解決済み】PytorchがCUDAは利用できないと言う件
-
[解決済み] usr/bin/env bash」と「#!/usr/bin/bash」の違いは何ですか?
-
[解決済み] ls -l の "total" が表示されるファイルサイズの合計にならないのはなぜですか?[クローズド]
-
[解決済み] svn diffコマンドの使用
-
[解決済み] あるパターンの前にテキストを追加する際に、大文字小文字を無視してsedを使用する
-
[解決済み] Linux/Ubuntu のセットです。不正なオプション -o pipefail
-
[解決済み] bashの「#$」はどういう意味ですか?
-
[解決済み] grepコマンドで特定の列にマッチングさせる
-
[解決済み】forkとexecの違いについて