setitimer - 本流の処理とは別に定期的に割り込み処理をしたいときに

本流の処理とは別に定期的に割り込み処理をしたいとき、例えば、ログを読みつつ整形して表示しつつ、n秒間にm行以上流れたら通知をするとかです。

PerlだとAnyEventのようなイベントドリブンのフレームワークを使いたくなりますが、単純な定期割り込みなら setitimer(2) で実装できます。Perlだと、Time::HiRes qw(setitimer) です。

3秒間に20行以上入力行が来た場合になんかするのはこんな感じ:


補足

setitimer(2) って linux だと alarm(2) と同じタイマーを共有してて たぶん setiimer(2) を発行したあと alarm(2) つかうと、setitimer(2) がクリアされるので ライブラリとかが中で alarm() つかってるケースについて注意する必要があるのかな とおもいました。

意外とタイマー制御に alarm() つかってるライブラリっておおかったりするんですよね。

alarm(2) と sigitimer(2) の関係 - tokuhirom's blog

指摘の通り、ライブラリで ALRM を使っていると、シグナルハンドラや ALRM が発火するタイミングが上書かれちゃいます。

ライブラリでタイムアウトを実装する際は、alarmじゃなくてselect(2)を使って欲しいですね。

あと、

getitimer() と setitimer() は廃止予定とされており、 代わりに POSIX タイマー API (timer_gettime(2), timer_settime(2) など) を使うことが推奨されている。

Man page of GETITIMER

というのをさっき知ってかなしくなりました。