Thread Wachsenden Dateien folgen: tail -f (33 answers)
Opened by sid burn at 2006-10-06 00:49

ptk
 2006-10-06 02:20
#70515 #70515
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich hätte auch gedacht, dass ein select() bei einem EOF wartet, aber dem ist nicht so. Ein Aufruf deines Skriptes mit truss zeigt:
Code: (dl )
1
2
select(8,{3},0x0,0x0,0x0)                        = 1 (0x1)
read(0x3,0x8185a88,0x64) = 0 (0x0)

in einer Endlosschleife laufen, also liefert select() immer sofort ein lesbaren Filehandle zurück. Und es scheint auch so gewollt zu sein, siehe beispielsweise den Thread hier: http://sources.redhat.com/ml/glibc-bugs/2004-05/msg00024.html

Bei FreeBSD sieht ein echtes "tail -f" in truss so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
fstat(3,0xbfbfdde0)                              = 0 (0x0)
break(0x8050000) = 0 (0x0)
lseek(3,0x0,SEEK_CUR) = 0 (0x0)
lseek(3,0x0,SEEK_SET) = 0 (0x0)
read(0x3,0x804f000,0x1000) = 487 (0x1e7)
munmap(0x28159000,0x1e7) = 0 (0x0)
read(0x3,0x804f000,0x1000) = 0 (0x0)
kqueue() = 4 (0x4)
fstatfs(0x3,0xbfbfde20) = 0 (0x0)
kevent(0x4,0x804d080,0x1,0x0,0x0,0xbfbfde18) = 0 (0x0)


Und das Programm wartet. Hier gibt es also einen speziellen "kernel event notification mechanism". Linux hat bestimmt etwas Ähnliches, oder verwendet eben auch nur den sleep 0.1-Workaround. Schau mal mit strace rein.

View full thread Wachsenden Dateien folgen: tail -f