Ändern Sie den übergeordneten Prozess eines Prozesses?

13

Ist es möglich, den übergeordneten Prozess eines Prozesses zu ändern? Wenn ja wie

Beispielsweise,

  • Wie gelingt screenes, eine screenSitzung 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 disownein Prozess den übergeordneten Prozess des Prozesses ändert, einfach weil der Name dies disownimpliziert. 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?

StackExchange für alle
quelle
disownEntfernt 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.
Warren Young
Erinnert sich der Prozess an den übergeordneten Prozess?
StackExchange for All
Wenn es wissen will, ruft es auf 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.
Warren Young
Klingt nach einer interessanten neuen Kernelfunktion.
ChuckCottrill

Antworten:

13

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, SIGTERMusw.) vorher.

screen(1)hat ein sehr elegantes Mittel zur Handhabung des Lösens und Wiederanbringens. Wenn Sie das erste Mal starten screen, 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ührt SCREENwird, 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 screenbeendet wird, wird der Dämon SCREENweiterhin 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 wiederherstellen screen, 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.

Arcege
quelle
Vielen Dank. Ich habe hinzugefügt: "Emacs-Client kann auf einer anderen Terminal-Registerkarte eine Verbindung zum Emacs-Server herstellen. Gibt es eine Änderung des übergeordneten Prozesses?"
StackExchange for All
1
Jeder Prozess hat nur ein Elternteil, bis das Elternteil stirbt oder es stirbt. Wenn es stirbt, ist der Punkt umstritten. Wenn der Elternteil stirbt, wird die PPID 1, der initProzess. 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.
Arcege
Wie hängt Emacs einen Client an einen Server in verschiedenen Terminal-Registerkarten an?
StackExchange for All
Der Server wartet auf einen Socket (normalerweise eine UNIX-Domain-Socket-Datei), der auf Verbindungen wartet. Die Clients würden an diesem Socket eine Verbindung herstellen. Tabs sind für die Kommunikation zwischen Client und Server irrelevant. Sie können verschiedene Tabs, verschiedene Terminalemulationen (xterm vs rxvt vs terminal) oder Xemacs sein. Jeder Client weiß, wo eine Verbindung hergestellt werden muss, sodass diese von überall aus erfolgen kann.
Arcege
1
Die übergeordnete Prozess-ID wird nicht immer zu 1. Dieser erhaltene Weisheitsabsolutismus ist seit über 3 Jahren falsch.
JdeBP
-1

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 !!!

user239712
quelle