É possível alterar o processo pai de um processo? Se sim, como?
Por exemplo,
como
screen
consegue anexar umascreen
sessã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
disown
um processo altera o processo pai do processo, simplesmente porque o nomedisown
implica 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?
disown
apenas 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.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.Respostas:
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ê iniciascreen
, 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 comoSCREEN
, 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
screen
terminar, o daemonSCREEN
ainda 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árioscreen
, 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.fonte
init
processo. É 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.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 !!!
fonte