1

test() という関数が 1 つあります。この関数を 30 秒ごとに呼び出したいです。実装したコード スニペットを見つけてください。

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タイマーを一時停止したいと考えています。一時停止の割り込みを実装するにはどうすればよいですか?

ありがとう、

4

2 に答える 2

3

マニュアルページからsetitimer

ゼロに設定されたタイマー (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);
}

上記のコードはテストされておらず、マニュアル ページを読むことによってのみコーディングされています。

于 2012-04-10T10:16:27.053 に答える
1

sigprocmask(2)システムコールなどでいくつかのシグナルをブロックすることを検討できます。

ただし、signal(7)の man ページを何度か読むことを強くお勧めします。シグナルハンドラーはいつでも発生する可能性があることを忘れないでください (fprintfまたはmalloc... の呼び出し中など、最悪の場合を含む)、直接的または間接的に async-signal-safe functionsのみを呼び出すことができます。そして、多くのライブラリ関数は、この小さな制限されたセットには含まれていません。通常の方法はvolatile sig_atomic_t、シグナル ハンドラでフラグを設定し、それを外部でテストすることです。

于 2012-04-10T10:16:25.157 に答える