0

我需要分别使用 SIGUSR2 和 SIGUSR1 阻止和唤醒进程。下面是我的信号处理程序子例程。如何唤醒被暂停阻止的进程?

void sig_handler(int sig) { 
    static int i = 1;
    if(sig == SIGUSR2) {
    pause();
    }
    else if(sig == SIGUSR1) {
/* I don't what to write here */
    }
}

另外,我在某处读到 pause() 不是一个好的编程习惯,还有其他方法可以暂停进程一段时间吗?

4

2 回答 2

0

看到这个页面

一般来说,在信号中做很多工作是……棘手的。有些东西不是异步信号安全的,因此它使健壮的编程变得有点困难。在您的情况下, pause() 等待信号到达,但由于您是从信号处理程序调用它,所以它不会在那里工作(我认为)。

至于使进程休眠并在信号上恢复。看看我上面链接的页面。最好的方法是让信号处理程序简单地设置标志并让主线程(即在 main() 或事件循环中)对这些标志作出反应。按照页面的建议,在收到 SIGUSR2 时使用 sigsuspend 暂停进程,直到收到 SIGURS1。

于 2012-09-17T06:27:58.830 回答
0

这很简单。使用'kill'系统调用-

void sig_handler(int sig) { 
    static int i = 1;
    if(sig == SIGUSR2) {
    pause();
    }
    else if(sig == SIGUSR1) {
        kill(<pid of process to wake up>, sig);
        // make sure that process with pid has registered for sig
    }
}
于 2016-05-18T05:00:46.317 回答