select() auf Dateien

From: Udo Erdelhoff <ue(at)nathan.ruhr.de>
Date: Sun, 24 Mar 2002 17:00:27 +0100

Hi,
da de-bsd-hackers ja nicht mehr existiert, mal hier:

Ich suche zur Zeit nach einer protablen(!) Methode, die named.stats
eines BIND 9.2.0 zu bearbeiten. Die Datei wird periodisch von BIND
geöffnet, neue Statistiken werden angehängt, dann wird die Datei
wieder zugemacht.

Mein Programm soll nun die existierende Datei abarbeiten, bis zum
EOF kommt, und dann darauf warten, daß sich was tut. Und eigentlich
hatte ich gedacht, select() dafür nutzen zu können, ungefähr so:

fd = open ("named.stats", O_RDONLY);
for (;;) {
        while (read(fd, ...) > 0) {
                /*Dateiinhalt auswert*/
        }
        FD_ZERO (&fd_read);
        FD_SET (fd, &fd_read);
        result = select (1, &fd_read, NULL, NULL, NULL);
}

Dummerweise gibt es dabei genau zwei Varianten:
a) Wenn ich das so mache, bleibt das Programm in select hängen
b) Wenn ich nach der while-Schleife ein lseek (fd, 0, SEEK_END) einfüge,
   um den eof-Status zu löschen, kehrt select sofort zurück

Ich habe dann mal einen Blick in tail.c geworfen, und der nutzt die
Kernel Event Queue (in -current), oder Signale, oder Polling. Da das
Programm aber sowohl auf FreeBSD als auch auf Solaris 2.6/8 laufen
soll, schrecke ich davor etwas zurück... der Tannenbaum-Spruch hat
seinen Hintergrund.

Meine Frage ist jetzt: Habe ich einen Fehler in meiner Implementierung
(die Beschreibung von num_fd ist nicht so ganz eindeutig) oder bin ich
völlig auf dem Holzweg?

/s/Udo

-- 
"God gave them the ability to reproduce...
...Science gave us the hope they won't." -KBK
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sun 24 Mar 2002 - 17:09:43 CET

search this site