Re: Fragen zu "stderr"

From: Marc Santhoff <M.Santhoff(at)t-online.de>
Date: Sat, 27 Oct 2007 23:30:09 +0200

Am Freitag, den 26.10.2007, 21:19 +0200 schrieb Bernd Walter:
> On Fri, Oct 26, 2007 at 04:15:01PM +0200, Oliver Fromme wrote:
> > Marc Santhoff wrote:
> > > ich habe hier ein Programm, das so heftig nach "stderr" schreibt, daß
> > > der Kanal nicht mehr aufnahmefähig ist. Dann gibt es einen Fehler
> > > [EAGAIN], also non-blocking-i/o. Ich hätte gefühlsmäßig eher mit
> > > blockierendem Verhalten gerechnet.
> > >
> > > Ist das unter FreeBSD die Standardeinstellung? Und wie verhält es sich
> > > mit den verschiedenen Systemversionen (hier 4.11 und 6/7-STABLE)?
> >
> > Das hat erstmal nichts direkt mit stderr zu tun, denn
> > stderr ist ja erstmal ein Filedescriptor wie jeder andere
> > auch, nur dass er aus Konvention für spezielle Dinge
> > verwendet wird.
> >
> > Entscheidend ist, was für eine Art Descriptor stderr in
> > Deinem Fall ist: Ist es ein tty, eine Pipe, eine einfache
> > Datei, ...? Bei einer einfachen Datei z.B. ist blockie-
> > rendes Verhalten die Standardeinstellung, sofern das
> > betreffende Programm nicht selbst auf non-blocking I/O
> > umschaltet.
> >
> > Wie gesagt, das verhält sich bei stderr eigentlich nicht
> > anders als bei jedem anderen Descriptor.
>
> Nun - es gibt eine Besonderheit, die damit zu tun hat wo so ein
> Desriptor her kommt.
> Meist werden die Descriptoren vom aufrufenden Programm irgendwann vor
> dem exec angelegt, mitunter sogar über Generationen durchvererbt.
> Damit hat auch das aufrufende Programm (z.B. die Shell) einen Einfluß
> darauf mit welchen Eigenschaften diese für das neue Programm
> voreingestellt sind.

Danke an Olli für die ausführliche Beschreibung!

Tatsächlich ist es ein TTY, kann aber durchaus auch in eine Textdatei
umgeleitet werden. Und ich weiß nicht genau, auf welche Art (manuell,
durch ein CGI etwa) das Programm gestartet wurde. Also heißt das für
mich, es ist erstmal unsicher, in welchem Modus der Kanal arbeitet und
ich muß prüfen und ggf. umschalten.

Meine Frage reduziert sich dann auf einen anderen Aspekt:
Mir wurde geraten, ich solle stderr erstmal schließen und neu öffnen
(was ich nun als unnötig ansehe), wie mache ich denn das? Wenn ich
stderr schließe, habe ich doch kein "handle" mehr, gibt es eine Methode,
den vom System übergebenen Kanal neu anzuschließen?

Danke,
Marc

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sat 27 Oct 2007 - 23:43:09 CEST

search this site