Verwendet ein Programm, da es z.B. im Hintergrund läuft keine Standardausgabe oder soll keine Fehler ausgeben, wird oftmals einfach der Dateideskriptor für die Standard- bzw. Standardfehlerausgabe geschlossen.

Man kann jedoch z.B. bei größeren Projekten nie wissen welche anderen ggf. dynamisch angezogenen Bibliotheken später doch auf diese Dateideskriptoren (file handles) zugreifen. Und genau hier beginnen die möglichen Stolpersteine:

Sobald man nach dem Schließen von stdin, stdout, stderr selbst ein Dateideskriptor öffnet, wird dafür der erste freie Index verwendet – bei geschlossenen stdin/out/err ist dies dann die Null. In der Folge gehen dann z.B. alle für stdout vorgesehenen printf-Ausgaben auf diesen Dateideskriptor, was zu sehr unerwünschten Ergebnissen führt.

Statt stdin(0), stdout(1), stderr(2) vollständig zu schließen, sollte besser der folgender Code verwendet werden:

{
    int fd;
    fd = open("/dev/null", O_WRONLY);
    if (fd >= 0) {
        dup2(fd, 1); // stdout
        dup2(fd, 2); // stderr
        close(fd);
    }
    fd = open("/dev/null", O_RDONLY);
    if (fd >= 0) {
        dup2(fd, 0); //stdin
        close(fd);
    }
}

Hier werden die Standard-Ein- und Ausgabekanäle auf /dev/null umgeleitet. Dies gilt natürlich nur, wenn man alles wirklich von Hand erledigen möchte. Ich empfehle hier stets den „normalen“ Weg, die Funktion der Standard-C-Bibliothek int daemon(int nochdir, int noclose) zu verwenden (man 3 daemon). Diese schiebt den Prozess in den Hintergrund und leitet bei noclose == 0 die Standard-Ein- und Ausgabekanäle auf /dev/null um.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Name *

zehn + vierzehn =