我需要分别使用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 */
}
}
另外,我读某处暂停()不是一个好的编程习惯,有没有其他方法可以暂停一段时间?
答案 0 :(得分:0)
请参阅this page
一般来说,在信号中做很多工作都很棘手。有些东西不是异步信号安全的,因此它使得强大的编程有点困难。在你的情况下,pause()等待信号到达,但由于你是从信号处理程序调用它,它不会在那里工作(我认为)。
关于使进程睡眠并恢复信号。看看我上面链接的页面。最好的方法是让信号处理程序简单地设置标志并使主线程(即在main()或事件循环中)对这些标志作出反应。根据页面的建议,在收到SIGUSR2时使用sigsuspend暂停进程,直到收到SIGURS1。
答案 1 :(得分: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
}
}