みなさん、 fork と signal を使っていくつかの実験をしているときに、非常に興味深い動作を示すプログラムに出くわしましたが、何時間も苦労した後、何が起こっているのかわかりませんでした。
私がやろうとしているのは、本体内に子プロセスを作成し、「hello world」を出力してから exit を呼び出すことです。この後、そのシグナル ハンドラが呼び出され、wait システム コールによってブロックされた親プロセスも呼び出されることが完全に理解されます。今、シグナルハンドラーで別のプロセスを作成していますが、それ以降、出力は無限になります。
出力は次のとおりです: Hello world Linux に来て UNIX に来て Linux に来て UNIX に来て Linux に来て UNIX に来て ...
また、何度も何度も印刷されたLinuxに来るのはなぜですか。
また、フォークが呼び出されたときに教えてください。重複したアドレス空間が親で構成されていることは知っていますが、シグナルハンドラーはどうですか。それらも重複しますか。私の場合、子呼び出しが終了すると。次に、呼び出されるシグナルハンドラーは子または親です。
助けてください。ありがとう。
void sig_handler(int signo)
{
if(fork() == 0){
}
else{
int pid = 0;
wait(&pid);
printf("Come to unix");
fflush(stdout);
}
}
int main()
{
if (signal(SIGCHLD, sig_handler) == SIG_ERR){
}
int child_pid;
int i;
child_pid = fork();
switch (child_pid) {
case -1:
perror("fork");
exit(1);
case 0:
printf("hello world\n");fflush(stdout);
exit(0);
default:
wait(&i);
printf("Come to linux");
exit(0);
//break;
}
return 0;
}