logo

Status de saída de um processo filho no Linux

Sabe-se que garfo() a chamada do sistema é usada para criar um novo processo que se torna filho do processo chamador. 
Ao sair, o filho deixa um status de saída que deve ser devolvido ao pai. Então, quando a criança termina, torna-se um zumbi .
Sempre que o filho sai ou para, o pai recebe uma mensagem SIGCHLD sinal. 
O pai pode usar a chamada do sistema wait() ou waitpid() junto com as macros WIFEXITED e WEXITSTATUS para saber sobre o status de seu filho interrompido.
(*)wait() chamada de sistema: suspende a execução do processo de chamada até que um de seus filhos termine. 
Sintaxe da chamada do sistema wait(): 

pid_t wait(int *status);


(*) A chamada do sistema waitpid(): suspende a execução do processo de chamada até que um filho especificado pelo argumento pid mude de estado. 
Sintaxe da chamada do sistema waitpid(): 

pid_t waitpid(pid_t pid int *status int options)


Nota: Por padrão, waitpid() espera apenas por filhos encerrados, mas esse comportamento é modificável por meio do argumento de opções, como WIFEXITED WEXITSTATUS etc.
O valor de pid pode ser: 
 



  1. Menor que -1: Significa esperar por qualquer processo filho cujo ID do grupo de processos seja igual ao valor absoluto de pid.
  2. Igual a -1: Significa esperar por qualquer processo filho.
  3. Igual a 0: Significa esperar por qualquer processo filho cujo ID do grupo de processos seja igual ao do processo chamador.
  4. Maior que 0: Significa aguardar o filho cujo ID do processo é igual ao valor de pid.


WIFEXITED e WEXITSTATUS são duas das opções que podem ser utilizadas para saber o estado de saída do filho. 
WIFEXITED(status): retorna verdadeiro se o filho terminou normalmente.
WEXITSTATUS(status): retorna o status de saída do filho. Esta macro deve ser empregada somente se WIFEXITED retornar verdadeiro.
Abaixo está uma implementação C na qual child usa execl() função, mas o caminho especificado para execl() é indefinido. 
Vamos ver qual é o valor do status de saída do filho que o pai obtém.

C
// C code to find the exit status of child process #include  #include  #include  #include  #include  // Driver code int main(void) {  pid_t pid = fork();    if ( pid == 0 )  {  /* The pathname of the file passed to execl()  is not defined */  execl('/bin/sh' 'bin/sh' '-c' './nopath' NULL);  }  int status;    waitpid(pid &status 0);  if ( WIFEXITED(status) )  {  int exit_status = WEXITSTATUS(status);   printf('Exit status of the child was %dn'   exit_status);  }  return 0; } 

Saída: 
 

Status de saída de um processo filho no Linux
 

Observação : O código acima pode não funcionar com o compilador online, pois fork() está desabilitado.
Aqui, o status de saída é 127, o que indica que há algum problema com o caminho ou um erro de digitação.
Alguns códigos de status de saída estão listados abaixo para obter informações extras: 
 

  • 1: Erros diversos, como 'dividir por zero' e outras operações inadmissíveis.

  • 2: Palavra-chave ou comando ausente ou problema de permissão.
  • 126: Problema de permissão ou comando não é executável
  • 128: argumento inválido para sair.


Nota: O padrão C não define o significado dos códigos de retorno. As regras para o uso de códigos de retorno variam em diferentes plataformas.
 

Criar questionário