2012-04-10 73 views
1

有一個名爲test()的函數,我想每30秒調用一次該函數,請查找我實現的代碼片段。C:如何暫停sigaction定時器

void init_sigaction(void) { 
    struct sigaction act;  
    act.sa_handler = test; //test() 
    act.sa_flags = 0; 
    sigemptyset(&act.sa_mask); 
    sigaction(SIGPROF, &act, NULL); 
} 


void init_time(void) { 
    struct itimerval val; 
    val.it_value.tv_sec = 30; //Timer 30 Seconds 
    val.it_value.tv_usec = 0; 
    val.it_interval = val.it_value; 
    setitimer(ITIMER_PROF, &val, NULL); 
} 

int main() 
{ 
    /*Set the handler for the signal SIG to HANDLER */ 
    signal(SIGINT, signal_handler); 
    init_sigaction(); 
    init_time(); 

    Some_other_function(); 

} 

現在我使用一些其他的功能,我想暫停sigaction的計時器,直到其他功能的執行。我如何實現中斷暫停?

謝謝,

+0

你想停止運行計時器,還是延遲信號處理程序的執行? – Hasturkun 2012-04-10 10:14:53

+0

我想停止計時器,當我的其他進程完成時,我想運行計時器。 – Nimit 2012-04-10 10:16:22

回答

2

setitimermanual page

其被設置爲零的計時器(it_value的零或計時器期滿,並且it_interval爲零)停止。

呼叫setitimer零次,並用有效的old_value參數存儲計時器的當前值,所以你可以稍後再啓動它。

編輯:

怎麼是這樣的:

struct itimerval old_timer; 

void pause_timer() 
{ 
    struct itimerval zero_timer = { 0 }; 
    setitimer(ITIMER_PROF, &zero_time, &old_timer); 
} 

void resume_timer() 
{ 
    setitimer(ITIMER_PROF, &old_timer, NULL); 
} 

注意上面的代碼是未經測試和編碼只有通過閱讀手冊頁。

+0

你能舉個例子嗎?謝謝... – Nimit 2012-04-10 10:23:26

+0

@Nimit添加了一些簡單的功能。 – 2012-04-10 10:37:29

+0

謝謝......它的工作。 – Nimit 2012-04-10 10:47:00

1

你可以考慮阻止一些信號,例如,系統調用sigprocmask(2)

但是,我強烈建議您閱讀幾次signal(7)手冊頁。不要忘記,信號處理程序可以隨時發生(包括在最差的時間,例如在呼叫fprintfmalloc ...),所以只能直接或間接呼叫異步信號安全功能;並且大量的庫函數不在這個小的受限集合中。通常的方法是在信號處理程序中設置一個volatile sig_atomic_t標誌,然後在外面測試它。