Alterar o processo pai de um processo?

14

É possível alterar o processo pai de um processo? Se sim, como?

Por exemplo,

  • como screenconsegue anexar uma screensessão e os processos em execução a diferentes processos de shell? Existe mudança no processo pai?

  • Parece que ouvi outras maneiras de alterar o processo do shell em que um programa está sendo executado, mas não me lembro. Também há alteração no processo pai do programa?

  • Eu pensei que disownum processo altera o processo pai do processo, simplesmente porque o nome disownimplica isso. Mas descobri que não é verdade.

  • O cliente Emacs pode se conectar ao servidor emacs em uma guia de terminal diferente. Existe mudança no processo pai?

Tim
fonte
disownapenas remove um determinado filho da lista interna de processos filhos de um shell. O PPID da criança permanece o da concha. O shell esqueceu que alguma vez iniciou esse filho, mas o kernel se lembra.
21815 Warren Young
O processo lembra seu pai?
Tim
Se quiser saber, ele chama getppid(2), uma chamada do sistema e chamadas do sistema são tratadas pelo kernel. Um programa pode ser confundido emitindo essa chamada, salvando o valor e, em seguida, usando esse valor após a alteração de seus pais. Há uma chance de uma condição de corrida aqui.
21815 Warren Young
Parece um novo recurso interessante do kernel.
ChuckCottrill

Respostas:

14

O ID do processo pai (ppid) de um processo não pode ser alterado fora do kernel; não há chamada do sistema setppid. O kernel alterará o ppid apenas para (pid) 1 após o término do processo pai - se o processo não responder a um sinal de que o processo foi encerrado. Para que isso aconteça, as necessidades do processo ter ignorado vários sinais ( SIGHUP, SIGTERM, etc.) com antecedência.

screen(1)possui um meio muito elegante de lidar com o desanexamento e a recolocação. Quando você inicia screen, na verdade você está iniciando uma interface do usuário (ui), que por padrão criará um daemon (o gerenciador de sessões). Este daemon não possui um terminal associado a ele, um novo grupo de processos ( setpgrp(2)), um novo ID de sessão ( setsid(2)). O daemon, executando como SCREEN, criará subprocessos conectados aos pseudo-terminais ( pty) e multiplexará os dados dos ptys e da ui ( screen). Os subprocessos pensam que estão conversando com um terminal real.

Se a interface do usuário screenterminar, o daemon SCREENainda estará em execução, armazenando dados em buffer, manipulando sinais, aguardando uma nova interface do usuário, etc. porque é um grupo de processos diferente e em sua própria sessão. Quando você se reconectar com uma nova interface do usuário screen, o daemon continuará a multiplexar como estava fazendo antes. O daemon continuará sendo executado até que todos os subprocessos terminem, sejam mortos, um bug fatal seja encontrado ou o host seja reinicializado.

Arcege
fonte
Obrigado. Eu adicionei "O cliente Emacs pode se conectar ao servidor emacs em uma guia de terminal diferente. Há alteração no processo pai?"
Tim
1
Todo processo tem apenas um pai, até que ele morra ou morra. Se morrer, o ponto é discutível. Se o pai falecer, o PPID se tornará 1, o initprocesso. É a única vez que o processo pai é alterado - quando o processo pai termina. A conexão via comunicação entre processos (tubos, soquetes, etc.) não afeta o PPID.
Arcege
Como o Emacs conecta um cliente a um servidor em diferentes guias de terminal?
Tim
O servidor escutaria em um soquete (geralmente um arquivo de soquete de domínio UNIX) aguardando conexões. O (s) cliente (s) abriria uma conexão nesse soquete. Guias são irrelevantes para a comunicação entre o cliente e o servidor, podem ser diferentes guias, emular diferentes teminal (xterm vs rxvt vs terminal) ou podem ser xemacs. Cada cliente sabe onde se conectar, portanto pode ser de qualquer lugar.
Arcege
1
O ID do processo pai nem sempre se torna 1. Esse absolutismo de sabedoria recebido está errado há mais de 3 anos, agora.
JdeBP # 02/15
-2

Compreendo. Você precisa mudar o kernel para escrever algum módulo para fazer isso! Eu acho que será útil em alguns casos. Por exemplo, você faz um trabalho árduo e longo, que consome muitos recursos por uma hora ... E quando o sistema não responde (como de costume neste caso), você executa algumas ações imprevisíveis (por causa de sua necessidade e não tem certeza de clicar em um mouse no lugar correto para que o sistema não responda por muito tempo) e mate o processo pai acidentalmente. Sistema normalmente mata todas as crianças! Porém, se o processo filho for raiz e o pai e o usuário ordinal apenas, a ação e o usuário ordinal também tornarem o usuário ordinal esse processo não eliminado em nenhum caso! E o pai dele será init com o PID 1. E depois que o sistema finalmente responder, você deseja restaurar a hierarquia. Mas você não pode !!! Padrão, você inicia o sistema de atualização como root do terminal como usuário comum com su. Por quê? Portanto, para obter todos os erros e avisos no console. Especialmente o utilitário para atualizar é a GUI. Eles obtêm essa informação para nada ... Lembro-me no Windows OS isso pode ser feito. Existem funções especiais do WinAPI. Por que no Linux isso não pode ser feito? Não está claro ... É simples !!!

user239712
fonte