2012-04-10 36 views
1

test()という関数が1つあります。この関数を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

+0

私はタイマーを停止したい、そして、私の他のプロセスが完了したら、私はタイマーを実行したい。 – Nimit

答えて

2

ゼロに設定され、タイマは(it_valueがゼロか、タイマーが満了した時にit_intervalがゼロである)を停止します。

ゼロ回と、タイマの現在値を格納するための有効なold_value引数でコールsetitimer、後で再びそれを起動することができますので。

編集:

どのようにこのようなものについて:

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

+0

@ニミットシンプルな機能をいくつか追加しました。 –

+0

ありがとうございます...それは働いています。 – Nimit

1

sigprocmask(2)システムコール。

ただし、signal(7)のマニュアルページを数回読むことを強くおすすめします。シグナルハンドラがいつでも発生する可能性があることを覚えておいてください(例えば、最悪の場合を含めて、fprintfまたはmallocへのコール中など)、直接的または間接的にしかコールできません。非同期シグナルセーフ機能;大量のライブラリ関数はこの小さな制限されたセットにはありません。普通の方法は、シグナルハンドラでフラグvolatile sig_atomic_tをセットし、それを外側でテストすることです。 setitimermanual pageから

関連する問題