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でも大差ない。とことで。