以前の質問であるfork と exec の違いを読みましたが、疑問が残りました。
子で execを使用fork()
して呼び出すと、によって作成された新しいプロセスexec
はまだ子ですよね?
親プロセスを強制終了すると、子プロセスも強制終了されますか?
一番上の回答に示されている図/例では、親プロセスが最初に終了すると子プロセスが終了し、コマンドの出力が部分的またはまったく得られないため、彼はwait
/を呼び出しますが、それは正しいですか?waitpid
ls
exec
現在実行中のプロセスイメージを新しいものに置き換えます。そうです、子は子プロセスです(実際には同じプロセスです)。
いいえ、親を殺しても子は殺されません(子は孤立しています)。
親プロセスを強制終了しても、子プロセスは強制終了されません。子プロセスが関数を呼び出すときexec
、それはまだ子プロセスです。
リンクされた質問の例では、フローチャートは、シェルがコマンドを呼び出すために使用するプロセスを大まかに説明しています。コマンドがバックグラウンド化されていない限り、シェル (親プロセス) は、子プロセスが終了するまで待ってから、コマンドの読み取りを続行します。そうでなければ、子供を待つ必要はありません。
この質問も参照してください。
fork() を使用し、子で exec を呼び出すと、exec によって作成された新しいプロセスはまだ子ですよね?
子で exec を呼び出すと、新しいプロセスは子によって処理されます。子のプロセスは exec 呼び出しに置き換えられます。
親プロセスを強制終了すると、子プロセスも強制終了されますか?
親プロセスが終了すると (少なくとも Linux では)、OS にシグナルを送信させることで子プロセスが終了する可能性がありますが、それ以外の場合は存続します。
親プロセスが最初に終了すると、子プロセスが終了し、ls コマンドの出力が部分的またはまったく得られないため、彼は wait/waitpid を呼び出しますが、それは正しいですか?
あなたが指摘した例のように、子プロセスを待ちたいと思うでしょう:a)終了時に子プロセスを正しく終了できますb)子プロセスは親のすべてのリソースにアクセスできます...つまり、子が親によって開かれたファイル ハンドルを持っていて、親が終了しても、実行中はファイルが開いていると子が想定すると、悪いことが起こります。
この簡単な例を見てみましょう: まず、プロセス リストの出力を見てください。
mike@linux-4puc:~> ps
PID TTY TIME CMD
18577 pts/2 00:00:00 bash
18643 pts/2 00:00:00 ps
次に、この小さなプログラムを実行します。
void main()
{
if(fork()){
printf("parent print");
}
else
while(1);
printf("done");
}
ここでは、親にメッセージ「parent print」と「done」を出力させます。完了したら「ps」リストを確認すると、ツリーに新しいプロセスがぶら下がっていることがわかります。
mike@linux-4puc:~> ps
PID TTY TIME CMD
18577 pts/2 00:00:00 bash
18673 pts/2 00:00:02 a.out
18678 pts/2 00:00:00 ps
その a.out は子であり、親が終了している間、while ループにずっと座っています。
.. the new process created by exec is still a child right?
はい、まだ子供です。
Does killing the parent process kills the child too?
いいえ。何らかの理由で親が死亡し、子がまだ実行中の場合、子はinit プロセス(プロセス ID=1) プロセスによって採用され、この孤立プロセスの新しい親になります。
calls wait/waitpid because if the parent process terminates first, the child...
waitpid/waitは、子のステータスを親に通知するためのものです。親プロセスに多くの子プロセスがある場合、特定の子プロセス ID を指定しない限り、親プロセスは通常、子プロセスを待機することに注意してください。