2012-01-12 22 views
2

SIGALRMを繰り返し設定して消えるまで待ってから、やり直してください。私は私のハンドラ関数では:SIGALRMを繰り返す方法は?

void handler(int signum) 
{ 
    struct itimerval timer; 
    struct sigaction sa; 

    sa.sa_handler = handler; 

    timer.it_interval.tv_sec = 0; 
    timer.it_interval.tv_usec = 0; 
    timer.it_value.tv_usec = 0; 
    timer.it_value.tv_sec = 1000; 

    sigaction(SIGALRM, &sa, 0); 
    setitimer(ITIMER_REAL, &timer, 0); 

    printf("pause for me\n"); 
    pause(); 
} 

と私のメインで私が持っている:

int main(void) 
{ 
    handler(0); 
    return 0; 
} 

しかし、それがないすべては二回、その後屋台繰り返しです。私はそれを繰り返し続けてほしい。どうしたの?

+0

シグナルハンドラから 'setitimer'を使用するのは安全ですか?しかし、おそらくここで大丈夫です。 –

+0

しかし 'timer_settime()'は[ok]です(http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html)。 –

答えて

4

struct sigactionには、初期化していないいくつかのフィールドがあります。あなたが最初に数回取得したスタックガーベッジが動作し、それからハンドラがインストールされていないケースが発生します。 sigaction()リターンをテストする必要があります。 -1を取得すると、errnoを含むメッセージが表示されます。

sigaction()に一度電話する必要があります(main()などから)。 SA_RESETHANDフラグを設定しないと "スティック"になります。そうすれば他の既存のコードがうまくいくでしょう。より正確な繰り返しタイミングについては

あなたはとき現在の火災、それはすぐに開始されますので、あなたがタイマ値を設定することができますstruct itimervalさんit_intervalを活用する必要があります。

関連する問題