Status de saída de um processo filho no Linux

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 %d  n  '           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