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?