Was ist der Unterschied zwischen dem Aufruf daemon() und den Aufruf von fork(), setsid(), fork(), etc.?
Habe ich beim erstellen von Unix-dæmons, und es scheinen zwei Methoden. Der langatmig eine, die scheint, kommen bei der Suche ist zu nennen fork()
, setsid()
, fork()
wieder chdir()
zu einem sicheren Ort, setzen Sie umask()
und schließlich close()
stdin
, stdout
und stderr
.
Läuft man daemon
bringt jedoch Informationen über einen daemon()
Funktion, die scheint, tun alle das gleiche Zeug wie oben. Gibt es irgendwelche Unterschiede zwischen den beiden Ansätzen oder ist daemon()
nur eine Komfort-Funktion, die macht das gleiche wie die langwierige Methode? Entweder man besser, vor allem für einen Anfänger C-Programmierer?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
daemon
Funktion ist nicht in POSIX definiert, so dass Ihre Umsetzung (wenn überhaupt) könnte sich anders Verhalten auf verschiedenen Plattformen.Auf Linux mit der glibc,
daemon
nur eine Gabel, Optionalchdir
s (aber nur/
können Sie nicht angeben, ein Pfad), nicht touch -umask
, und nicht in der Nähe derstd*
Deskriptoren (Optional geöffnet zu/dev/null
obwohl). (Quelle)Also es hängt von der Plattform ab, und mindestens eine Durchführung nicht weniger als das, was Sie tun. Wenn Sie brauchen, alles, was Sie tun, mit dem stick (oder stick, um eine Plattform, wo die
daemon
Funktion tut genau das)./dev/null
ist vorzuziehen, um diese zu schließen, weil sonst die nächsten Dateien, die Ihr daemon öffnet (log-Dateien, sockets, ...) erhalten diese Datei-Deskriptoren, die dich beißen, werden sagen, wenn einige Bibliotheken, die Sie aufrufen entscheidet zu schreiben, einen Fehler zustderr
...Beachten Sie, dass
daemon
ist nicht konform zu irgendeinem standard. Besser verwenden Sie standard-konforme Funktionen (ähnlich wie die POSIX-definiertenfork
undsetsid
).Den daemon aufrufen, fasst die langwierige Gabel Verfahren, und ich erinnere mich nicht, jede Umsetzung, die tut nichts mehr.
Seit daemon() ist ein high-level-Konzept, es ist definitiv bevorzugt werden für Anfänger und erfahrene Programmierer.