Wie erstelle ich einen Prozess-Daemon?

68

Ich versuche zu verstehen, wie ich mein Programm zu einem Daemon machen kann. Einige Dinge, auf die ich gestoßen bin, sind: Im Allgemeinen führt ein Programm die folgenden Schritte aus, um ein Daemon zu werden:

  1. Rufen Sie an fork( ).
  2. Rufen Sie im übergeordneten Element an exit( ). Dadurch wird sichergestellt, dass der ursprüngliche Elternteil (der Großelternteil des Dämons) davon überzeugt ist, dass sein Kind beendet wurde, dass der Elternteil des Dämons nicht mehr ausgeführt wird und dass der Dämon kein Prozessgruppenleiter ist. Dieser letzte Punkt ist Voraussetzung für den erfolgreichen Abschluss des nächsten Schritts.

  3. Rufen Sie an setsid( )und geben Sie dem Dämon eine neue Prozessgruppe und Sitzung, die beide als Leiter fungieren. Dadurch wird auch sichergestellt, dass dem Prozess kein steuerndes Terminal zugeordnet ist (da der Prozess gerade eine neue Sitzung erstellt hat und keine zuweist).

  4. Ändern Sie das Arbeitsverzeichnis in das Stammverzeichnis über chdir( ). Dies geschieht, weil sich das geerbte Arbeitsverzeichnis an einer beliebigen Stelle im Dateisystem befinden kann. Daemons werden in der Regel für die Dauer der Systemverfügbarkeit ausgeführt, und Sie möchten kein zufälliges Verzeichnis offen halten, um zu verhindern, dass ein Administrator das Dateisystem, das dieses Verzeichnis enthält, aushängt.

  5. Schließen Sie alle Dateideskriptoren.

  6. Öffnen Sie die Dateideskriptoren 0, 1 und 2 (Standard-In, Standard-Out und Standardfehler) und leiten Sie sie an weiter /dev/null.

Kann mir jemand einen Link zu vorhandenem Quellcode eines Programms wie Apache geben, damit ich diesen Prozess genauer verstehen kann?

registrierter Nutzer
quelle
2
Sie können Apache-Quellen hier erhalten .
Nmichaels
7
Vielleicht könnte Daemon (3) hilfreich sein. Grundsätzlich heißt es, dass die benötigte Funktionalität bereits implementiert ist.
Vlad
@nmichaels danke für deine Nachricht eigentlich suche ich nur jene Zeilen, die es zu einem Daemon machen. Apache nicht speziell.
Registrierter Benutzer
1
Der obige Beitrag besteht zu fast 100% aus dem Buch Linux System Programming, 2. Auflage - Direktes Gespräch mit der Kernel and C Library von Robert Love (Seiten 173, 174). Es wäre schön, wenn @RegisteredUser das erwähnt hätte.
patryk.beza

Antworten:

19

Wenn Sie nach einem sauberen Ansatz suchen, sollten Sie die Verwendung von Standard-APIs in Betracht ziehen int daemon(int nochdir, int noclose);. Manpage ziemlich einfach und selbsterklärend. Manpage . Eine gut getestete API überwiegt bei weitem unsere eigenen Implementierungsintervalle in Bezug auf Portabilität und Stabilität.

Deadbeef
quelle
Ich bin froh, dass dies jetzt eine Antwort ist , anstatt in den Kommentaren versteckt zu sein. Vielleicht könnten Sie es ein wenig ausarbeiten - Link zum Standard (oder noch besser, Link zu einem Tutorial oder Beispiel).
RJHunter
2
@deadbeef Diese Antwort ist viel besser als der einfache Link nur Antworten , die vorher vorhanden waren. Aber obwohl es auch nur einem Link ziemlich nahe kommt (trotzdem würde ich den angegebenen Link als viel stabiler betrachten). Ich würde versuchen, die Antwort zu verbessern, indem ich ein kurzes Codebeispiel gebe (zumal es auf der verlinkten Manpage keine gibt) oder die Zusammenfassung zitiere.
πάντα ῥεῖ
2
Beachten Sie, dass die Daemon- Funktion nicht POSIX-kompatibel ist.
patryk.beza
2
Auf freedesktop.org/software/systemd/man/daemon.html#SysV%20Daemons steht geschrieben, dass "die BSD- daemon()Funktion nicht verwendet werden sollte, da sie nur eine Teilmenge dieser [15] Schritte implementiert."
oli_arborum
2

Unter Linux kann dies einfach durchgeführt werden mit:

Alok Prasad
quelle