Ich versuche, die POSIX-Signalverarbeitung und Jobsteuerung richtig zu emulieren fürmein Lieblingsbetriebssystem, aber mir ist nicht klar, was mit einer Sitzung geschehen soll, nachdem der Sitzungsleiter sie beendet.
Ich kann keine Dokumentation dazu finden, was mit der Sitzung und ihrem Prozess geschieht, wenn beispielsweise ein untergeordneter Prozess den Sitzungsleiter beendet, während mehrere Hintergrundprozesse und ein anderer Vordergrundprozess ausgeführt werden.
Meine Tests zeigen, dass alle Prozesse in der Sitzung beendet werden, aber wie?
Erhalten sie ein bestimmtes Signal?
Ist dieser Fall im POSIX-Standard spezifiziert? Und wenn ja, können Sie einige Referenzen angeben?
Antwort1
Sie sind nicht der einzige, der sich über POSIX-Sitzungen wundert; Lennart Poettering (der systemd
Berühmte)ist auch verwirrt.
Soweit man es beurteilen kann, erbt ein Sitzungsleiter, wenn er stirbt, init
die verwaiste Sitzung und
Alle Sitzungsmitgliedsprozesse in der Vordergrundprozessgruppe (sofern vorhanden) erhalten ein SIGHUP.
Sitzungsmitgliedsprozesse, die sich nicht in der Vordergrundgruppe befinden, erhalten kein Signal.
Siehe auch:
- notes.shichao.io/apue/ch9
- Kapitel 10 "Prozesse" In Der Linux-Kernelvon Andries Brouwer (2003).
Wenn das Terminal durch Auflegen des Modems verschwindet und die Leitung nicht lokal war, wird ein SIGHUP an den Sitzungsleiter gesendet. [...] Wenn der Sitzungsleiter stirbt, wird ein SIGHUP an alle Prozesse in der Vordergrundprozessgruppe gesendet. [...] Wenn also das Terminal stirbt und der Sitzungsleiter eine Jobsteuerungs-Shell ist, kann er die Dinge für seine Nachkommen erledigen, indem er ihnen beispielsweise erneut ein SIGHUP sendet. Wenn der Sitzungsleiter andererseits ein unschuldiger Prozess ist, der kein SIGHUP abfängt, stirbt er und alle Vordergrundprozesse erhalten ein SIGHUP.
Andries Brower,Der Linux-Kernel, Abschnitt 10.3 "Sitzungen".