我有兩個處理程序(SIGTSTP,SIGCHLD),事情是當我用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表示如果該進程被暫停或停止,則「粉碎」父進程的狀態。
看來,用正確的標誌,你可以告訴哪個孩子被暫停,以及它收到了哪個信號。所以這不僅可以讓你檢測到實際的退出,還可以採取一些行動來暫停/恢復。 –