Como é definido um ID de grupo de processos?

4

Eu li que o ID de uma sessão é o mesmo que o pid do processo que criou a sessão por meio da chamada de sistema setsid() , mas não encontrei nenhuma informação sobre como um ID de grupo de processos é definido. O ID do grupo de processos é o mesmo que o pid do processo que criou o grupo de processos?

    
por user7681202 12.11.2017 / 16:16

1 resposta

6

Em geral, sim, o ID do grupo de processos é igual ao ID do processo que criou o grupo de processos - e esse processo criou o grupo de processos colocando-se no grupo.

Você pode encontrar essas informações na documentação da chamada do sistema setpgid e de sua variante setpgrp . Os detalhes variaram historicamente entre o BSD e o System V. Os casos de uso mais comuns são:

  • Um processo se coloca em seu próprio grupo de processos e o novo PGID é igual ao PID. Isso pode ser feito com SysV setpgrp() ou com setpgid(0, 0) , em que 0 pode ser substituído por getpid() explícito.
    Note que enquanto o processo está se colocando no grupo, na prática, isso é feito frequentemente por um ativador (shell, ou monitor do daemon) antes de executar o programa , isto é é feito por código no iniciador entre fork e execve no processo filho.
  • Um processo se coloca em um grupo de processos existente na mesma sessão. Shells fazem isso para pipelines: para executar foo | bar em seu próprio grupo de processos, um shell normalmente faz algo assim:

    1. Configurar um canal.
    2. Bifurque um processo. O filho se coloca em seu próprio grupo de processos G , fecha a extremidade de leitura do canal e move a extremidade de gravação para stdout, depois executa foo .
    3. Bifurque um processo. O filho se coloca no grupo de processos existente G , fecha a extremidade de gravação do canal e move a extremidade vermelha para stdin, depois executa bar .

    A chamada para setpgid pode ser executada no processo pai em vez de ou além do filho. Fazê-lo evita uma condição de corrida caso a inicialização do segundo filho ultrapasse o primeiro filho.

  • Um shell com controle de job normalmente é executado em seu próprio grupo de processos. Mas antes de sair ou suspender, ele retorna ao seu grupo de processos original (ou seja, ele se coloca de volta no grupo de processos que o iniciou, supondo que esse grupo ainda exista).

A especificação POSIX para setpgid descreve esses casos de uso. Além disso, explica que não há muito mais que seja garantido que funcione. Em particular, enquanto sistemas BSD antigos permitiam que um processo ingressasse em um grupo de processos em uma sessão diferente ou para criar um novo PGID, este não é o caso na maioria dos sistemas modernos (incluindo o moderno BSD).

    
por 12.11.2017 / 17:22