信号の処理方法を学ぼうとしています。私のプログラムには、以前に作成されたサブプロセスの pid の配列があります。いいえ、数秒ごとに sigtstp シグナルをそれらの 1 つに送信したいと思います。親プロセスに sigchld を送信して終了するだけです。親プロセスは、終了したプロセスの終了コードを出力し、終了したプロセスの代わりに次のプロセスを作成する必要があります。最初のループではすべて正常に動作しますが、2 番目のループではハングします。したがって、出力で次を取得します。
loop
slept
forking
in to array
loop
Zakonczyl sie potomek 3934 z kodem 0.
そのため、スリープは最初のループでは機能しますが、2 番目のループでは機能しないようです。または、シグナルを処理した後にメインプロセスが制御を戻さなかったが、これは発生しないはずです。したがって、ここで何が間違っているのかわかりません。
while(1) {
printf("loop\n");
sleep(5);
printf("slept\n");
int r = rand() % n;
if(kill(process_tab[r],SIGTSTP) < 0) {
printf("Error while sending sigtstp signal.\n");
} else {
printf("forking\n");
if((child = fork()) < 0) {
printf("Fork failed.\n");
} else if(child == 0) {//to sie dzieje w procesie
if(signal(SIGTSTP,&catch_sigtstp)) {
printf("Error while setting signal handler.\n");
_exit(EXIT_FAILURE);
}
while(1) {
}
} else { //to sie dzieje w parencie
process_tab[r] = child;
printf("in to array\n");
}
}
}
そして、ここにハンドラーがあります。
void catch_sigtstp(int signal) {
kill(ppid,SIGCHLD);
_exit(EXIT_SUCCESS);
}
void catch_sigchld (int signal) {
int status;
pid_t child = wait(&status);
printf("Zakonczyl sie potomek %d z kodem %d.\n",child,status);
}