我必须为它们中的每个(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指示“粉碎”父进程的状态(无论是否暂停)。
最佳答案
使用sigaction
和SA_NOCLDSTOP
设置您的SIGCHLD处理程序。
来自sigaction(2)
更新
void signalHandler(int sig)
{
//...
}
struct sigaction act;
act.sa_handler = signalHandler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_NOCLDSTOP;
if (sigaction(SIGCHLD, &act, 0) == -1)
{
perror("sigaction");
exit(1);
}
如果您不熟悉
sigaction
,则应该仔细阅读它,因为它具有多种不同的选项和行为,这些选项和行为远远优于signal
,但是在弄清楚如何使用它之前会付出复杂性和困惑的代价。对于您似乎想做的事情,我做出了最大的猜测,但您需要早点而不是迟一点地学习。关于c - SIGTSTP和SIGCHLD有什么关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19883512/