Modificare il processo padre di un processo?


14

È possibile modificare il processo padre di un processo? Se si, come?

Per esempio,

  • come screenriesce a collegare una screensessione e i processi in esecuzione al suo interno a diversi processi shell? C'è un cambiamento nel processo genitore?

  • Mi sembra di aver sentito parlare di altri modi di cambiare il processo della shell in cui è in esecuzione un programma, ma non ricordo. C'è anche un cambiamento nel processo genitore del programma?

  • Ho pensato che disownun processo cambi il processo genitore del processo, semplicemente perché il nome lo disownimplica. Ma ho scoperto che non è vero.

  • Il client Emacs può collegarsi al server emacs su una diversa scheda terminale. C'è un cambiamento nel processo genitore?


disownrimuove solo un determinato figlio dall'elenco interno dei processi figlio di una shell. Il PPID del bambino rimane quello della shell. La shell ha dimenticato di aver mai avviato quel figlio, ma il kernel ricorda.
Warren Young,

Il processo ricorda il suo genitore?
Tim

Se vuole sapere, chiama getppid(2), una chiamata di sistema e le chiamate di sistema sono gestite dal kernel. Un programma potrebbe essere confuso emettendo quella chiamata, salvando il valore e quindi usando quel valore dopo che la sua parentela è cambiata. C'è una possibilità di una condizione di gara qui.
Warren Young,

Sembra un'interessante nuova funzionalità del kernel.
ChuckCottrill

Risposte:


14

L'ID del processo padre (ppid) di un processo non può essere modificato al di fuori del kernel; non c'è nessuna chiamata di sistema setppid. Il kernel cambierà il ppid in (pid) 1 solo dopo il termine del processo parent - se il processo non ha risposto a un segnale che il parent è stato terminato. Perché ciò avvenga, le esigenze del processo di aver ignorato vari segnali ( SIGHUP, SIGTERM, ecc) in anticipo.

screen(1)ha un modo molto elegante di gestire il distacco e il riattacco. Al primo avvio screen, stai effettivamente avviando un'interfaccia utente (ui), che per impostazione predefinita creerà un demone (il gestore della sessione). A questo demone non è associato alcun terminale, un nuovo gruppo di processi ( setpgrp(2)), un nuovo id di sessione ( setsid(2)). Il demone, in esecuzione come SCREEN, creerà quindi sottoprocessi collegati a pseudo-terminali ( pty), quindi multiplexerà i dati dai ptys e dalla ui ( screen). I sottoprocessi pensano di parlare con un vero terminale.

Se l'interfaccia utente screentermina, il daemon SCREENsarà ancora in esecuzione, memorizzerà i dati nel buffer, gestirà i segnali, aspetterà una nuova interfaccia utente, ecc. Perché è un gruppo di processi diverso e nella sua stessa sessione. Quando ti ricolleghi con una nuova interfaccia utente screen, il demone continuerà a multiplexare come prima. Il demone continuerà a funzionare fino a quando tutti i sottoprocessi non verranno terminati, verrà ucciso, verrà rilevato un errore irreversibile o il riavvio dell'host.


Grazie. Ho aggiunto "Il client Emacs può collegarsi al server emacs su una diversa scheda terminale. C'è un cambiamento nel processo genitore?"
Tim

1
Ogni processo ha un solo genitore, fino a quando il genitore non muore o muore. Se muore, il punto è discutibile. Se il genitore muore, il PPID diventa 1, il initprocesso. Questa è l'unica volta in cui il processo genitore cambia - quando termina il processo genitore. La connessione tramite comunicazione tra processi (tubi, prese, ecc.) Non ha alcun effetto sul PPID.
Arcege,

In che modo Emacs collega un client a un server in diverse schede terminali?
Tim

Il server è in ascolto su un socket (di solito un file socket di dominio UNIX) in attesa di connessioni. I client aprirebbero una connessione su quel socket. Le schede sono irrilevanti per la comunicazione tra client e server, potrebbero essere diverse schede, diversi emulati teminali (xterm vs rxvt vs terminal) o potrebbero essere xemacs. Ogni client sa dove connettersi, quindi potrebbe essere ovunque.
Arcege,


-2

Capisco. Devi cambiare il kernel per scrivere qualche modulo per farlo! Penso che sarà utile in alcuni casi. Ad esempio, fai un lungo duro lavoro che richiede molte risorse per un'ora ... E quando il sistema non risponde (come al solito in questo caso) fai alcune azioni imprevedibili (a causa di ciò che devi fare e non sei sicuro di fare clic un mouse nella posizione corretta in modo che il sistema non risponda a lungo) e uccida accidentalmente il processo genitore. Il sistema di solito uccide tutti i bambini! Ma se il processo figlio è root e genitore solo l'utente e l'azione ordinali rendono anche l'utente ordinale questo processo non ucciso in nessun caso! E suo genitore sarà init con PID 1. E dopo che il sistema alla fine risponderà, vorrai ripristinare la gerarchia. Ma non puoi !!! Standard si avvia l'aggiornamento del sistema come root dal terminale come utente normale con su. Perché? Quindi, per ottenere tutti gli errori e gli avvisi sulla console. Soprattutto l'utilità per l'aggiornamento è la GUI. Ottengono queste informazioni per niente ... Ricordo che in Windows OS questo può essere fatto. Esistono funzioni WinAPI speciali. Perché in Linux questo non può essere fatto? Non è chiaro ... È semplice !!!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.