Altera o processo pai de um processo?

12

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

Por exemplo,

  • como o screen consegue anexar uma sessão screen e os processos que estão sendo executados dentro dela para diferentes processos do shell? Há alguma mudança no processo pai?

  • Parece que ouvi falar de outras formas de alteração do processo de shell em que um programa está em execução, mas não me lembro. Há também mudança de processo pai do programa?

  • Achei que disown em um processo altera o processo pai do processo, simplesmente porque o nome disown implica isso. Mas eu achei que não é verdade.

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

por Tim 01.04.2015 / 23:00

2 respostas

10

O id do processo pai (ppid) de um processo não pode ser alterado fora do kernel; não há chamada de sistema setppid. O kernel somente alterará o ppid para (pid) 1 após o pai dos processos ter terminado - se o processo não respondeu a um sinal de que o pai foi finalizado. Para que isso aconteça, o processo precisa ter ignorado vários sinais ( SIGHUP , SIGTERM , etc.) antecipadamente.

screen(1) tem um meio muito elegante de lidar com a remoção e a reativação. Quando você inicia pela primeira vez screen , na verdade você está iniciando uma interface de usuário (ui), que por padrão criará um daemon (o gerenciador de sessões). Esse 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, executado como SCREEN , criará subprocessos conectados a pseudo-terminais ( pty ) e, em seguida, multiplexará os dados de ptys e ui ( screen ). Os subprocessos acham que estão falando com um terminal real.

Se o ui screen terminar, o daemon SCREEN ainda estará em execução, armazenando dados em buffer, manipulando sinais, aguardando um novo ui, etc., porque é um grupo de processos diferente e em sua própria sessão. Quando você reconectar com um novo ui screen , o daemon continuará a multiplexar como estava antes. O daemon será executado e continuará em execução até que todos os subprocessos sejam finalizados, sejam eliminados, um erro fatal seja encontrado ou o host seja reinicializado.

    
por 02.04.2015 / 00:05
-1

Eu entendo. 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 longo e demorado, eles pegam muitos recursos por uma hora ... E quando o sistema não responde (como de costume neste caso) você faz algumas ações imprevisíveis (por causa de você precisa fazer e você não tem certeza de clicar um mouse no lugar correto para que o sistema não responda por um longo período) e mate acidentalmente o processo pai. Sistema geralmente mata todas as crianças! Mas se o processo filho for root e pai apenas o usuário ordinal e a ação também tornarem o usuário ordinal, esse processo não será morto em nenhum caso! E seu pai será init com PID 1. E depois que o sistema 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ê? Então, para obter todos os erros e avisos no console. Especialmente o utilitário para atualizar é GUI. Eles obtêm essa informação para nada ... Lembro-me no sistema operacional Windows isso pode ser feito. Existem funções especiais WinAPI. Por que no Linux isso não pode ser feito? Não está claro ... É simples!

    
por 07.07.2017 / 23:23