ファイルに書かれたら irc とかネットに通知するとかそういうデーモンを作るときは mkfifo するといいんじゃないか
デーモン側をこんな感じで書きます。
use Errno qw(EEXIST); use Fcntl qw(S_IFIFO); use POSIX qw(mkfifo); my $FIFO_NAME = "/tmp/my_messenger.fifo"; if (mkfifo($FIFO_NAME, 0666)) { # ok } elsif ($! == EEXIST) { die "$FIFO_NAME is not a fifo!" unless +(stat($FIFO_NAME) & !S_IFIFO) != 0; } else { die "failed to create fifo:$FIFO_NAME, $!"; } while (1) { open my $fh, '<', $FIFO_NAME or die "failed to open fifo:$FIFO_NAME, $!"; while (my $line = <$fh>) { send_message_to_somewhere($line); # どっかに通知する関数 } }
メッセージを送る側は、普通にリダイレクトするだけで OK
% echo hello world >> /tmp/my_messenger.fifo
デーモンのコードの中で FIFO かどうか毎回チェックしてるので万が一ファイル上書いちゃってもデーモン再起動すればOK。というわけで、FIFO いいよという話でした。もうちょっとサンプルコード整理しといた
2011/3/4追記: 通常ファイルを使わずに mkfifo する理由は、通常ファイルだと定期的にトランケートが必要になるけど、そのタイミングで書き込まれたらどうするのという問題(競合)があるから。なのでたとえば crontab で5分かかる処理の結果を /somescript >> /tmp/to_irc みたくして通知しようと思うと通常ファイル + inotify とかじゃダメで mkfifo 一択になる。一方で mkfifo を使う場合は、バッファサイズが 4KB (linuxの場合) なので、通知を受け取って転送する側のプログラムは、できるだけ早くバッファからの読み込みを行う必要がある(そうしないと最悪書き込み側がブロックする)