Moderne Betriebssysteme stellen Anwendungen Ressourcen durch untersützende Dienste (Dämonen, eng. Daemons) zur Verfügung.

graph TB
    A[Anwendung] -->|leicht, einfach| B["Dienste: 
    Umgang mit den Ressourcen
    (Betriebsmittelabstraktion)"]
    B -->|schwierig, umständlich| C1[Betriebsmittel]

Beispiele

  • initd - Elternprozess aller anderen Prozesse (PID 1)
  • dhcpd - Zur dynamischen TCP/IP Konfiguration
  • crond - Job Scheduler
  • sshd - Secure Shell Server
  • sendmail - SMTP Daemon

Daemon erstellen

if (fork() != 0) exit(0);
  • fork dupliziert den Prozess und gibt die Prozess-ID zurück
  • Der duplizierte Prozess hat immer die ID 0
  • Unterhalb dieser Zeile macht nur noch der Kindprozess weiter
  • Weil der Elternprozess sich danach sofort beendet hat, wird der Kindprozess vom initd “adoptiert”
  • Das SIGHUP-Signal kommt nicht durch und dadurch bleibt der Prozess auch am laufen, wenn sich der Elternprozess schließt

Daemon unsterblich machen

  • Bei vielen Daemons ist es erwünscht, dass sie niemals nicht laufen und immer wenn sie beendet werden wieder neu starten
for (;;) { // Bis zum nächsten Stromausfall
	procid = fork(); 
	
	if (procid > 0) { 
		// Elternprozess:
		// Wartet auf Terminierung
		wait(&zustand);
		// Neuer Kindprozess übernimmt
	}
	else {
		// Kindprozess läuft
		for (;;) { 
			// Hier kommen wir nur per SIGKILL raus
			// Um den Daemon zu beenden, muss der
			// Elternprozess beendet werden
		}	
	}
}
  • Der Prozess dupliziert sich
  • Der Elternprozess wartet bis das Kind beendet wurde
  • Sobald das passiert ist, wird die Schleife wiederholt und ein neues Kind wird erstellt