AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 545244
Accepted
Alexis King
Alexis King
Asked: 2019-10-06 04:34:17 +0800 CST2019-10-06 04:34:17 +0800 CST 2019-10-06 04:34:17 +0800 CST

O pai de um processo tem algum significado da perspectiva de seu filho?

  • 772

No POSIX, os processos são “relacionados” entre si por meio de duas hierarquias básicas:

  1. A hierarquia dos processos pai e filho.

  2. A hierarquia de sessões e grupos de processos.

Os processos do usuário têm muito controle sobre o último, via setpgide setsid, mas eles têm muito pouco controle sobre o primeiro—o ID do processo pai é definido quando um processo é gerado e alterado pelo kernel quando o pai sai (geralmente para PID 1 ), mas caso contrário não muda. Refletindo sobre isso, tenho me perguntado quão importante é o relacionamento entre pais e filhos.

Aqui está um resumo do meu entendimento até agora:

  • Os relacionamentos pai-filho são claramente importantes do ponto de vista do processo pai , pois várias syscalls, como waite setpgid, são permitidas apenas em processos filho.

  • A relação sessão-grupo-processo é claramente importante para todos os processos, tanto para o líder da sessão quanto para outros processos na sessão, uma vez que syscalls killoperam em grupos de processos inteiros, setpgidsó podem ser usados ​​para ingressar em um grupo na mesma sessão e todos os processos no grupo de processos em primeiro plano de uma sessão são enviados SIGHUPse o líder da sessão sair.

  • Além disso, as duas hierarquias estão claramente relacionadas do ponto de vista do pai, uma vez que setsidafeta apenas novos filhos e setpgidsó podem ser usadas em crianças, mas parecem essencialmente não relacionadas do ponto de vista da criança (uma vez que o processo de morte do pai não tem impacto algum no grupo ou sessão de um processo).

No entanto, visivelmente ausente está qualquer razão para um processo filho se importar com o que seu pai atual é. Portanto, tenho a seguinte pergunta: o valor atual de getppid()tem alguma importância do ponto de vista do processo filho , além de talvez identificar se seu processo de desova saiu ou não?


Para colocar a mesma questão de outra forma, imagine que o mesmo programa é gerado duas vezes, do mesmo pai, de duas maneiras diferentes:

  1. O primeiro filho é gerado da maneira usual, fork()seguido por exec().

  2. O segundo filho é gerado indiretamente: o processo pai chama fork(), e o filho também chama fork(), e é o processo neto que chama exec(). O filho imediato sai, então o neto fica órfão e seu PPID é reatribuído ao PID 1.

Nesse cenário hipotético, supondo que tudo o mais seja igual, algum programa razoável tem algum motivo para se comportar de maneira diferente? Até agora, minha conclusão parece ser “não”, já que a sessão permanece inalterada, assim como os descritores de arquivos herdados do processo… mas não tenho certeza.

Nota: Eu não considero “adquirir o PID pai para se comunicar com ele” como uma resposta válida para essa pergunta, uma vez que programas órfãos geralmente não podem confiar que seu PPID seja definido como 1 (alguns sistemas definem o PPID de processos órfãos para alguns outro valor), portanto, a única maneira de evitar uma condição de corrida é adquirir o ID do processo pai por meio de uma chamada para getpid() antes da bifurcação e, em seguida, usar esse valor no filho.

process
  • 3 3 respostas
  • 1387 Views

3 respostas

  • Voted
  1. Best Answer
    kirbyfan64sos
    2019-11-07T11:50:05+08:002019-11-07T11:50:05+08:00

    Quando vi essa pergunta, fiquei bastante interessado porque sei que já vi getppid usado antes .. mas não conseguia lembrar onde. Então, eu me voltei para um dos projetos que eu imaginei que provavelmente usou todos os syscalls do Linux e mais alguns: systemd . Uma pesquisa no GitHub mais tarde e encontrei dois usos que retratam alguns casos de uso mais gerais (também existem alguns outros usos, mas são mais específicos para o systemd):

    • Em sd-notify . Para algum contexto: o systemd precisa saber quando um serviço foi iniciado para poder iniciar qualquer um que dependa dele. Isso normalmente é feito a partir de um programa C por meio da API sd_notify , que é uma maneira de os daemons informarem ao systemd seu status.

      Claro, se você estiver usando um script de shell como um serviço... chamar funções C não é exatamente factível. Portanto, o systemd vem com o comando systemd-notify , que é um pequeno wrapper sobre a API sd_notify. Um problema: o systemd também precisa saber o PID que está enviando a mensagem. Para systemd-notify, esse seria seu próprio PID, que seria um ID de processo de curta duração que desaparece imediatamente. Nao é útil.

      Você provavelmente já sabe para onde estou indo: getppid é usado pelo systemd-notify para pegar o PID do processo pai, já que geralmente é o processo de serviço real. Resumindo, getppid pode ser usado por um aplicativo CLI de curta duração para enviar uma mensagem em nome do processo pai.

      Uma vez que encontrei isso, outra ferramenta unix que pode usar getppid como esta me veio à mente: polkit, que é uma estrutura de autenticação de processo usada para bloquear coisas como enviar mensagens D-Bus ou executar aplicativos privilegiados. (No mínimo, acho que você viu os prompts de senha da GUI que são exibidos pelos agentes de autenticação do polkit.) O polkit inclui um executável nomeado pkexecque pode ser usado um pouco como o sudo, exceto que agora o polkit é usado para autorização. Agora, o polkit precisa saber o PID do processo pedindo autorização... sim, você entendeu, o pkexec usa getppid para encontrar isso .

      (Ao olhar para isso, também descobri que o agente de autenticação TTY do polkit também o usa .)

    • Este é um pouco menos interessante, mas ainda notável: getppid é usado para emular PR_SET_PDEATHSIG se o pai tiver morrido no momento em que o sinalizador foi definido. (A bandeira é apenas uma maneira de uma criança receber automaticamente um sinal como SIGKILL se o pai morrer.)

    • 6
  2. Ted Cushman
    2019-10-07T06:32:18+08:002019-10-07T06:32:18+08:00

    Zombies : Este é um caso extremo, mas é eficaz no sentido de que afeta se um programa é interrompido ou não. A única situação que encontrei em que o comportamento de um processo filho é diferente com base em qual processo ele é pai é no momento em que ele sai. Quando um processo sai, SIGCHLDé enviado para ppido filho. Se o processo pai estiver bloqueado ou não estiver manipulando SIGCHLD, o filho será deixado em um estado zumbi até que o sinal de saída seja recebido. Se o ppidfilho mudar enquanto ele estiver em um estado zumbi, matando o processo pai e sendo re-pai para init, e SIGCHLDo filho for recebido, o filho terminará de terminar e será colhido.

    • 1
  3. Ted Cushman
    2019-10-07T11:12:04+08:002019-10-07T11:12:04+08:00

    Parece que a variedade de cenários em que um processo precisa de qualquer conhecimento de qualquer outro processo em um sistema, como pai, avô, etc. envolve gerenciamento de processos e/ou comunicação entre processos. Para restringir ainda mais o escopo, o intervalo de operações que aceitam a pid_tcomo argumento ou retornam a pid_t, são principalmente tarefas de sinalização e outras tarefas de gerenciamento de processos. Dada uma gama tão limitada de usos, as únicas razões em que posso pensar para usar getppid, além das informações de diagnóstico, seriam se o filho precisasse sinalizar o pai ou determinar se o pai ainda está em execução. Por exemplo, mod_mdno Apache httpd envia um sinal de reinicialização normal para o processo pai para acionar uma reconfiguração.

    Embora a "Nota" em sua pergunta descreva uma boa alternativa para getppid, ela também parece sugerir um possível uso para getppid. Para contextualizar, eu estava assistindo a uma apresentação da PWL Conf 2019 ontem à noite, On the Expressive Power of Programming Languages ​​, e a definição de "expressividade" desse artigo está influenciando minha interpretação da questão. A definição se resume a como o comportamento de um programa pode ser diferente com ou sem a presença de um recurso.

    Começando com as hipóteses:

    • Um processo precisa sinalizar seu processo pai por algum motivo.
    • Diferentes sistemas operacionais lidam com processos órfãos de re-parentalidade de forma diferente.

    O que significa se o pré- forkPID não corresponder getppid? Comparar o pré fork-PID com getppidpode realmente fornecer um mecanismo multiplataforma e livre de corrida para um processo filho determinar se ele ficou órfão. Se pre-fork-pid != getppidentão a criança é órfã, caso contrário não é.

    Isso parece uma coisa incomum de se precisar, ou algo que provavelmente seria escrito usando a compilação específica da plataforma #ifdef, quando necessário. Além disso, um efeito semelhante pode ser obtido usando kill 0o pré- fork- pid, no entanto, isso pode gerar falsos positivos em processos de execução suficientemente longos quando o sistema reutiliza IDs de processo "antigos".

    Portanto, a combinação de um ID de processo pré fork-pai imutável e uma chamada "ao vivo" getppidparece ser um mecanismo altamente confiável e multiplataforma para verificar ou sinalizar um processo pai.

    • 1

relate perguntas

  • Como substituir os IDs de usuário e IDs de grupo por nomes em vez de números em "ps"?

  • Como obter os IDs dos grupos suplementares de um processo?

  • O que `/proc/irq/.../spurious` contém?

  • Um processo pai pode alterar o ambiente de seu filho?

  • Como 'ejetar' obtém processos para fechar identificadores de arquivo?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve