Re: select() auf Dateien

From: Bernd Walter <ticso(at)cicely8.cicely.de>
Date: Sun, 24 Mar 2002 23:16:07 +0100

On Sun, Mar 24, 2002 at 05:00:27PM +0100, Udo Erdelhoff wrote:
> 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);

fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);

> for (;;) {
> while (read(fd, ...) > 0) {
> /*Dateiinhalt auswert*/
> }
> FD_ZERO (&fd_read);
> FD_SET (fd, &fd_read);
> result = select (1, &fd_read, NULL, NULL, NULL);
                           fd + 1,
> }
>
> Dummerweise gibt es dabei genau zwei Varianten:
> a) Wenn ich das so mache, bleibt das Programm in select hängen

Klar - deiner tut nur bei fd == 0;
Du solltet natürlich noch fd >= FD_SETSIZE abfangen.

> 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

Kann ich mir jetzt nicht so richtig erklären.
Ich habe allerdings so ein Programm auch noch nie schreiben müssen.

> 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.

poll ist Ursprünglich sysv und gibt es selbstverständlich auch unter
Solaris.
kqueue kann nur als optimierte Alternative gelten.
Du kannst aber aus dem CVS durchaus auch Sourcen vor kqueue auschecken..

> 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?

Ein fd_set ist ein Bitfeld und mit num_fd gibst du an bis zu welcher
Stelle select das Feld auswerten soll.
Mit '1' gibst du an nur bis zur Feldposition für den Filedescriptor '0'
zu prüfen.

-- 
B.Walter              COSMO-Project         http://www.cosmo-project.de
ticso(at)cicely.de         Usergroup           info(at)cosmo-project.de
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 - 23:20:24 CET

search this site