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
というのをさっき知ってかなしくなりました。