
UNIXプロセスについて学んでいますが、少し理解できません。次のコードがあるとしましょう。
void fork_child()
{
if (fork() == 0) {
/* Child */
printf("Running Child, PID = %d\n",
getpid());
while (1)
; /* Infinite loop */
} else {
/* Parent */
printf("Terminating Parent, PID = %d\n",
getpid());
exit(0);
}
}
親プロセスが以前に終了したため、明示的に子プロセスを終了することはわかっていますが、コードを実行すると、シェルは子プロセスのwhileループを待たずにバックグラウンドで実行されるのと似ています。この問題の主な原因は何ですか?
ありがとう
答え1
wait()
子プロセスが終了するまでブロックするには、親プロセスを呼び出す必要があります。
答え2
シェル自体は、自分が開始するプロセスの子について実際には知りません。たとえば、シェルはプロセス A を開始し、プロセス B を開始してから A を終了します。 Bは引き続き実行されますが、init
PID 1の子になります。シェルの子にはなりません。
_exit(2)
マニュアルページLinuxでは(POSIXの類似表現):
このプロセスのすべての子プロセスはに継承されます
init(1)
。このプロセスの親プロセスにシグナルを送信しますSIGCHLD
。
SIGCHLD
新しい親プロセスが子プロセスからシグナルを受け取り、wait()
子プロセスを呼び出すことを担当する必要があるため、祖父母が親なしのプロセスを継承することは良い考えではありません。他のプログラムを実行するすべてのプログラムは、複数の子プロセスを処理できるように準備する必要があります。
もちろん、サブプロセスがシェルが読み続けているパイプを保持している場合(コマンドの置換など)、シェルは待つ必要があります。これは、パイプが閉じるまですべての入力を受信したことを知らないからです。