tail -fとtailfは全然同じ件
id:rx7さんのエントリ。
⇒ http://d.hatena.ne.jp/rx7/20090320/p1
tailfなんて知らんかったー。とことで、調べてみた。ソースコードはここ。inotify使ってるのね。カーネルオプション入れてないと効かないけど、Ubuntuどうよ?
$ grep INOTIFY /boot/config-2.6.24-23-generic CONFIG_INOTIFY=y CONFIG_INOTIFY_USER=y
大丈夫ぽい。straceしてみる。
$ strace tailf /var/log/messages stat64("/var/log/messages", {st_mode=S_IFREG|0640, st_size=442, ...}) = 0 nanosleep({0, 250000000}, NULL) = 0 stat64("/var/log/messages", {st_mode=S_IFREG|0640, st_size=442, ...}) = 0 nanosleep({0, 250000000}, NULL) = 0 stat64("/var/log/messages", {st_mode=S_IFREG|0640, st_size=442, ...}) = 0
あるぇ?statでサイズ調べてnanosleepで寝てるだけ。ダメじゃん。上のソースを見ると、HAS_INOTIFY_INITっぅフラグがあるので、
$ gcc -g -o tailf -DHAVE_INOTIFY_INIT tailf.c
んな感じでビルドして動かしてみた。
$ strace ./tailf ./a.txt inotify_init() = 3 inotify_add_watch(3, "./a.txt", IN_MODIFY|IN_DELETE_SELF|IN_MOVE_SELF|IN_UNMOUNT) = 1
ここで待ってる。別窓でvi ./a.txtして、ごにょごにょ書き込んで:w。
read(3, "\1\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0", 64) = 16 open("./a.txt", O_RDONLY) = 4 fstat64(4, {st_mode=S_IFREG|0644, st_size=65, ...}) = 0 lseek(4, 37, SEEK_SET) = 37 read(4, "fasdfasdfasdfasdfasdfasfd:w\n", 8192) = 28 write(1, "fasdfasdfasdfasdfasdfasfd:w\n", 28) = 28 read(4, "", 8192) = 0 close(4) = 0
いい感じ。だけど、/var/log/messagesをヲチするとSIGINTが飛んできてすぐに終了しちゃう。ので、この実験ではソースにsighandler仕掛けてキャンセルしちゃってる。ので、CTRL-Cで止まらない。あと、locale関連でコンパイルエラーがでるので、コメントアウトしちゃってる。しょぼしょぼ。
んじゃ、tail -fはどうよ?とことで、strace。
$ strace tail -f /var/log/messages nanosleep({1, 0}, NULL) = 0 clock_gettime(CLOCK_MONOTONIC, {34075, 481443192}) = 0 fstat64(3, {st_mode=S_IFREG|0640, st_size=1053, ...}) = 0 clock_gettime(CLOCK_MONOTONIC, {34075, 481571550}) = 0 nanosleep({1, 0}, NULL) = 0 clock_gettime(CLOCK_MONOTONIC, {34076, 481704316}) = 0 fstat64(3, {st_mode=S_IFREG|0640, st_size=1053, ...}) = 0 clock_gettime(CLOCK_MONOTONIC, {34076, 481832195}) = 0
寝てる時間が250msecか1秒かの違いだけで、やってることは同じ。なので、tail -fでもtailfでも大差ない。とことで。