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
Verwandte Themen