2013-04-27 105 views
0

我的計劃得到很多的信號,在第二。然而,我希望能夠執行一些代碼的每一秒。如果我只是這樣做:與延遲發送信號給我自己的過程用C在Linux(Ubuntu的)

toSleep = ONESEC; 
while (toSleep > 0) 
    toSleep = sleep(toSleep); 

該程序獲取的信號導致此while while循環餓死。

如果可能有某種方式來送我自己的進程的信號每秒,將是完美的,因爲該信號會在信號隊列中等待,發生在它的轉機。

我該怎麼做?

回答

3

有一個孩子發出的信號。沒有錯誤檢查一個簡單的例子(也,你應該使用sigaction的,而不是信號):

#include <stdio.h> 
#include <signal.h> 

void handle(int s) { return; } 
int main(void) { 
    if(fork()) { 
     while(1) { 
      signal(SIGUSR1, handle); 
      pause(); 
      printf("Signal received\n"); 
     } 
    } else { 
     while(1) { 
      sleep(1); 
      kill(getppid(), SIGUSR1); 
     } 
    } 
    return 0; 
} 

此外,而不是發送信號,你可能會考慮讓孩子寫到管道(或者,如果使用signalfd()可用),然後阻止讀取。它有時是顯著清潔器完全避免信號。

+0

好主意!謝謝 – Bush 2013-04-27 14:03:43