如何唤醒暂停()阻止的进程?

时间:2012-09-17 06:06:26

标签: process block

我需要分别使用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 */
    }
}

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

2 个答案:

答案 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
    }
}