4

タイマーを開始し、有効期限が切れたときに呼び出される関数が必要です。

グーグルは、マニュアルの例を含む多くの例を見つけ、そのすべてがsigaction()シグナルハンドラの設定に使用されます。

ただし、@Patryk は、この質問で次のように述べています 。

void cbf(union sigval);
struct sigevent sev;
timer_t timer;

sev.sigev_notify = SIGEV_THREAD;
sev.sigev_notify_function = cbf; //this function will be called when timer expires
sev.sigev_value.sival_ptr = (void*) arg;//this argument will be passed to cbf
timer_create(CLOCK_MONOTONIC, &sev, &timer);

これは、より短く、よりシンプルで、よりクリーンで、より保守しやすいものです...

何を与える?これは正しいです?それは単なるラッパーsigaction()ですか?例で明示的にシグナル ハンドラーを設定するのはなぜですか?

また、このメソッドまたはシグナル ハンドラーのいずれかによってタイマーを開始した場合、タイマーtimer_settimeをキャンセルすると、システムがそのタイマーとコールバックの間の関連付けを削除することになりますか、それとも明示的に行う必要がありますか?


[更新]シグナルまたは以下の回答に示す方法のいずれかを選択できます(またはその両方ですが、ばかげているようです)。それは好みの問題です。Singals は、複雑さを犠牲にして、もう少し機能性を提供するかもしれません。

あなたがやりたいことがタイマーを開始し、それが期限切れになったときに通知を受けることだけなら、私の答えの方法は最も簡単です.

4

3 に答える 3