Use waitpid para criança que tenha groupid 1

0

Pesquisei muito mas não encontrei uma solução. Então pode ser uma pergunta boba.

O formato do waitpid é

pid_t waitpid (pid_t pid, int *status, int options)

O parâmetro pid especifica exatamente qual processo ou processos aguardar. Seus valores caem quatro campos:

< -1
Wait for any child process whose process group ID is equal to the absolute value of this value.

-1
Wait for any child process. This is the same behavior as wait( ).

0
Wait for any child process that belongs to the same process group as the calling process. 

> 0
Wait for any child process whose pid is exactly the value provided.

Agora, a questão é se pai e filho têm ID de grupo diferente e o id de grupo de filho é 1. Como usar o waitpid para esse filho específico? Porque não podemos usar -1, ele dirá para esperar por qualquer criança.

    
por Debian_yadav 04.07.2018 / 15:06

2 respostas

0

Você só pode esperar por crianças do seu processo.

Se o filho alterar o ID do grupo de processos, o novo ID do grupo de processos poderá ser usado como um número negativo com waitpid() .

BTW: a função waitpid() está obsoleta desde 1989. A função moderna é: waitid() e suporta o que você gosta:

waitid(idtype, id, infop, opts) 
    idtype_t        idtype; 
    id_t            id; 
    siginfo_t       *infop;         /* Must be != NULL */ 
    int             opts; 

Se você gosta de esperar por um grupo de processos, use:

waitid(P_PGID, pgid, infop, opts);

Portanto, se você realmente tiver um processo no ID do grupo de processos 1, ligue:

waitid(P_PGID, 1, infop, opts);

Mas como init já usa esse id do grupo de processos, você precisa ser o processo init para poder ter filhos no pgid 1.

No entanto, isso não funcionará se você estiver em uma plataforma que não implementa waitid() como um syscall, mas como uma emulação na parte superior do waitpid() desatualizado.

As vantagens de waitid() são:

  • permite especificar claramente o que esperar (por exemplo, P_PID P_PGID P_ALL)

  • retorna todos os 32 bits do parâmetro exit(2) no filho de volta ao processo pai.

  • permite esperar com o sinalizador: WNOWAIT que não colhe o filho e o mantém para mais tarde na tabela de processos.

BTW: O ponteiro siginfo_t em waitid() é idêntico ao segundo parâmetro da função de manipulador de sinal para SIGCHLD .

    
por 04.07.2018 / 15:16
0

Você terá alguns problemas para entrar em uma situação em que o ID do grupo de processos de um processo filho é 1 .

Os grupos de processos são principalmente para shells que executam processos de primeiro plano e plano de fundo (pipelines). Geralmente, quando um novo grupo de processos é iniciado, ele obtém o ID do grupo de processos do ID do processo do primeiro processo. Você não terá um filho com PID 1, assim você não terá um filho com PGID 1 também.

A chamada setpgid() permite mover o processo de um grupo de processos para outro, mas eles ainda precisam fazer parte da mesma sessão (login), portanto você também não pode mover um processo para o PGID 1 dessa maneira.

Se você tem um shell rodando como PID 1, então ele pode ter o PGID 1 também. Mas, desde que o shell mude o PGID de seus filhos, eles terão um PGID diferente.

    
por 04.07.2018 / 15:19