我必须为它们中的每个(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指示“粉碎”父进程的状态(无论是否暂停)。

最佳答案

使用sigactionSA_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/

10-11 15:54