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:
- Rufen Sie an
fork( )
. 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.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).Ä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.Schließen Sie alle Dateideskriptoren.
- Öffnen Sie die Dateideskriptoren 0, 1 und 2 (Standard-In, Standard-Out und Standardfehler) und leiten Sie sie an weiter
/dev/null
.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>
int main (void)
{
pid_t pid;
int i;
/* create new process */
pid = fork ( );
if (pid == -1)
return -1;
else if (pid != 0)
exit (EXIT_SUCCESS);
/* create new session and process group */
if (setsid ( ) == -1)
return -1;
/* set the working directory to the root directory */
if (chdir ("/") == -1)
return -1;
/* close all open files--NR_OPEN is overkill, but works */
for (i = 0; i < NR_OPEN; i++)
close (i);
/* redirect fd's 0,1,2 to /dev/null */
open ("/dev/null", O_RDWR);
/* stdin */
dup (0);
/* stdout */
dup (0);
/* stderror */
/* do its daemon thing... */
return 0;
}
Kann mir jemand einen Link zu vorhandenem Quellcode eines Programms wie Apache geben, damit ich diesen Prozess genauer verstehen kann?
quelle
Antworten:
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.quelle
daemon()
Funktion nicht verwendet werden sollte, da sie nur eine Teilmenge dieser [15] Schritte implementiert."Unter Linux kann dies einfach durchgeführt werden mit:
int main(int argc, char* argv[]) { daemon(0,0); while(1) { sleep(10) /*do something*/ } return 0; }
quelle