Ist es möglich, den übergeordneten Prozess eines Prozesses zu ändern? Wenn ja wie
Beispielsweise,
Wie gelingt
screen
es, einescreen
Sitzung und die darin ausgeführten Prozesse an verschiedene Shell-Prozesse anzuhängen ? Gibt es eine Änderung des übergeordneten Prozesses?Ich habe offenbar von anderen Methoden zur Änderung des Shell-Prozesses gehört, in denen ein Programm ausgeführt wird, kann mich aber nicht erinnern. Gibt es auch einen Wechsel des Elternprozesses des Programms?
Ich dachte, dass
disown
ein Prozess den übergeordneten Prozess des Prozesses ändert, einfach weil der Name diesdisown
impliziert. Aber ich fand es nicht wahr.Der Emacs-Client kann auf einer anderen Terminal-Registerkarte eine Verbindung zum Emacs-Server herstellen. Gibt es eine Änderung des übergeordneten Prozesses?
quelle
disown
Entfernt einfach ein bestimmtes untergeordnetes Element aus der internen Liste der untergeordneten Prozesse einer Shell. Die PPID des Kindes bleibt die der Shell. Die Shell hat vergessen, dass es jemals dieses Kind angefangen hat, aber der Kernel erinnert sich.getppid(2)
, ein Systemaufruf und Systemaufrufe werden vom Kernel behandelt. Ein Programm könnte verwirrt werden, indem dieser Aufruf ausgegeben, der Wert gespeichert und dann verwendet wird, nachdem sich seine Herkunft geändert hat. Hier besteht die Möglichkeit einer Rennbedingung.Antworten:
Die übergeordnete Prozess-ID (ppid) eines Prozesses kann nicht außerhalb des Kernels geändert werden. Es gibt keinen Setppid-Systemaufruf. Der Kernel ändert die ppid erst nach Beendigung des übergeordneten Prozesses in (pid) 1, wenn der Prozess nicht auf ein Signal reagiert hat, dass der übergeordnete Prozess beendet wurde. Damit dies geschehen kann , haben die Prozessanforderungen verschiedene Signale (ignoriert
SIGHUP
,SIGTERM
usw.) vorher.screen(1)
hat ein sehr elegantes Mittel zur Handhabung des Lösens und Wiederanbringens. Wenn Sie das erste Mal startenscreen
, starten Sie tatsächlich eine Benutzeroberfläche (UI), die standardmäßig einen Daemon (den Sitzungsmanager) erstellt. Diesem Dämon ist kein Terminal zugeordnet, eine neue Prozessgruppe (setpgrp(2)
), eine neue Sitzungs-ID (setsid(2)
). Der Daemon, der als ausgeführtSCREEN
wird, erstellt dann Unterprozesse, die mit Pseudoterminals (pty
) verbunden sind, und multiplext dann die Daten von den ptys und der ui (screen
). Die Subprozesse denken, sie sprechen mit einem echten Terminal.Wenn die Benutzeroberfläche
screen
beendet wird, wird der DämonSCREEN
weiterhin ausgeführt, puffert Daten, verarbeitet Signale, wartet auf eine neue Benutzeroberfläche usw., da es sich um eine andere Prozessgruppe und eine eigene Sitzung handelt. Wenn Sie die Verbindung mit einer neuen Benutzeroberfläche wiederherstellenscreen
, wird der Dämon wie zuvor weiter gemultiplext. Der Dämon wird so lange ausgeführt, bis alle Unterprozesse beendet, beendet, ein schwerwiegender Fehler festgestellt oder der Host neu gestartet wurde.quelle
init
Prozess. Dies ist das einzige Mal, dass der übergeordnete Prozess geändert wird - wenn der übergeordnete Prozess beendet wird. Die Verbindung über die Interprozesskommunikation (Rohre, Sockets usw.) hat keine Auswirkungen auf die PPID.Ich verstehe. Sie müssen den Kernel ändern, um ein Modul dafür zu schreiben! Ich denke, es wird in einigen Fällen nützlich sein. Wenn Sie zum Beispiel lange harte Arbeit leisten, beanspruchen sie viele Ressourcen für eine Stunde ... Und wenn das System nicht reagiert (wie in diesem Fall üblich), führen Sie einige unvorhersehbare Aktionen aus (weil Sie dies tun müssen und nicht sicher sind, ob Sie klicken) eine Maus an der richtigen Stelle, damit das System längere Zeit nicht reagiert) und den versehentlich übergeordneten Prozess abbricht. System tötet normalerweise alle Kinder! Aber wenn der untergeordnete Prozess root und der übergeordnete Prozess nur ein ordinaler Benutzer ist und die Aktion auch einen ordinalen Benutzer macht, wird dieser Prozess auf keinen Fall abgebrochen! Und sein Elternteil wird mit PID 1 initialisiert. Und nachdem das System zuletzt geantwortet hat, möchten Sie die Hierarchie wiederherstellen. Aber du kannst nicht !!! Standardmäßig starten Sie das Upgrade-System als root vom Terminal als normaler Benutzer mit su. Warum? Also um alle Fehler und Warnungen auf die Konsole zu bekommen. Insbesondere das zu aktualisierende Dienstprogramm ist GUI. Sie bekommen diese Informationen zu nichts ... Ich erinnere mich, in Windows-Betriebssystem kann dies getan werden. Es gibt spezielle WinAPI-Funktionen. Warum ist das unter Linux nicht möglich? Es ist nicht klar ... Es ist eine einfache Sache !!!
quelle