Est-il possible de changer le processus parent d'un processus? Si oui, comment?
Par exemple,
comment
screen
parvient-il à attacher unescreen
session et les processus en cours d'exécution à différents processus shell? Y a-t-il un changement de processus parent?Il me semble avoir entendu parler d'autres façons de changer le processus shell dans lequel un programme est en cours d'exécution, mais je ne me souviens pas. Y a-t-il également un changement de processus parent du programme?
J'ai pensé
disown
qu'un processus change le processus parent du processus, simplement parce que son nom l'disown
indique. Mais j'ai trouvé que ce n'était pas vrai.Le client Emacs peut se connecter au serveur emacs sur un onglet de terminal différent. Y a-t-il un changement de processus parent?
disown
supprime simplement un enfant donné de la liste interne des processus enfants d'un shell. Le PPID de l'enfant reste celui de la coquille. Le shell a oublié qu'il n'a jamais démarré cet enfant, mais le noyau s'en souvient.getppid(2)
, un appel système et les appels système sont gérés par le noyau. Un programme peut être confondu en émettant cet appel, en enregistrant la valeur, puis en utilisant cette valeur après que sa filiation a changé. Il y a une chance d'une condition de course ici.Réponses:
L'identifiant du processus parent (ppid) d'un processus ne peut pas être modifié en dehors du noyau; il n'y a pas d'appel système setppid. Le noyau ne changera le ppid en (pid) 1 qu'après la fin du processus parent - si le processus n'a pas répondu à un signal indiquant que le parent s'est terminé. Pour que cela se produise, les besoins du processus d'avoir ignoré différents signaux (
SIGHUP
,SIGTERM
, etc.) au préalable.screen(1)
dispose d'un moyen très élégant de gérer le détachement et le rattrapage. Lorsque vous démarrez pour la première foisscreen
, vous démarrez en fait une interface utilisateur (ui), qui par défaut créera un démon (le gestionnaire de session). Ce démon n'a pas de terminal associé, un nouveau groupe de processus (setpgrp(2)
), un nouvel identifiant de session (setsid(2)
). Le démon, fonctionnant en tant queSCREEN
, créera alors des sous-processus connectés aux pseudo-terminaux (pty
), puis multiplexera les données des ptys et des ui (screen
). Les sous-processus pensent parler avec un vrai terminal.Si l'interface utilisateur se
screen
termine, le démonSCREEN
sera toujours en cours d'exécution, en tamponnant les données, en gérant les signaux, en attendant une nouvelle interface utilisateur, etc. car il s'agit d'un groupe de processus différent et dans sa propre session. Lorsque vous vous reconnectez avec une nouvelle interface utilisateurscreen
, le démon continue de multiplexer comme il le faisait auparavant. Le démon s'exécutera et continuera jusqu'à ce que tous les sous-processus se terminent, soient tués, qu'un bogue fatal se produise ou que l'hôte redémarre.la source
init
processus. C'est la seule fois où le processus parent changerait - à la fin du processus parent. La connexion via la communication interprocessus (tuyaux, sockets, etc.) n'a aucun effet sur le PPID.Je comprends. Vous devez changer le noyau pour écrire un module pour le faire! Je pense que ce sera utile dans certains cas. Par exemple, vous faites un long travail acharné, ils prennent de nombreuses ressources pendant des heures ... Et lorsque le système ne répond pas (comme d'habitude dans ce cas), vous effectuez des actions imprévisibles (car vous devez le faire et vous n'êtes pas sûr de cliquer sur une souris au bon endroit pour que le système ne réponde pas longtemps) et tue accidentellement le processus parent. Le système tue généralement tous les enfants! Mais si le processus enfant est root et parent uniquement, l'utilisateur et l'action ordinaux rendent également l'utilisateur ordinal ce processus non tué en aucun cas! Et son parent sera init avec le PID 1. Et après que le système ait enfin répondu, vous voulez restaurer la hiérarchie. Mais tu ne peux pas !!! Standard, vous démarrez le système de mise à niveau en tant que root à partir du terminal en tant qu'utilisateur ordinaire avec su. Pourquoi? Donc, pour obtenir toutes les erreurs et avertissements sur la console. L'utilitaire de mise à niveau est particulièrement GUI. Ils obtiennent ces informations pour rien ... Je me souviens que dans Windows OS, cela peut être fait. Il existe des fonctions spéciales WinAPI. Pourquoi sous Linux, cela ne peut pas être fait? Ce n'est pas clair ... C'est simple !!!
la source