それぞれに 2 つのハンドラー (SIGTSTP、SIGCHLD) があります。SIGTSTP を使用してプロセスを一時停止すると、SIGCHLD のハンドラー関数も実行されます。これを防ぐにはどうすればよいですか。
シグナルハンドラ:
void signalHandler(int signal) {
int pid, cstatus;
if (signal == SIGCHLD) {
susp = 0;
pid = waitpid(-1, &cstatus, WNOHANG);
printf("[[child %d terminated]]\n", pid);
DelPID(&JobsList, pid);
}
}
void ctrlZsignal(int signal){
kill(Susp_Bg_Pid, SIGTSTP);
susp = 0;
printf("\nchild %d suspended\n", Susp_Bg_Pid);
}
Susp_Bg_Pid は、一時停止されたプロセス ID を保存するために使用されます。
susp は、親プロセスが中断されているかどうかにかかわらず、親プロセスを「スマッシュ」する状態を示します。