2012-09-17 29 views
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 */ 
    } 
} 

另外,我在某處讀了暫停()不是一個好的編程習慣,有沒有其他方法暫停進程一段時間?

回答

0

this page

一般情況下,做了很多的作品中信號的...棘手。有些東西不是異步信號安全的,因此它使得強壯的編程有點困難。在你的情況下,pause()等待一個信號到達,但由於你是從信號處理程序調用它,它不會在那裏工作(我認爲)。

至於使進程睡眠並恢復信號。看看我上面鏈接的頁面。最好的方法是讓信號處理程序簡單地設置標誌並使主線程(即在main()或事件循環中)對這些標誌作出反應。按照頁面建議,當收到SIGUSR2時使用sigsuspend暫停進程,直到收到SIGURS1。

+0

ok。但我如何喚醒睡眠過程? –

+0

編輯回答這部分的問題以及... –

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 
    } 
} 
相關問題