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:
- Menor que -1: Significa esperar por qualquer processo filho cujo ID do grupo de processos seja igual ao valor absoluto de pid.
- Igual a -1: Significa esperar por qualquer processo filho.
- Igual a 0: Significa esperar por qualquer processo filho cujo ID do grupo de processos seja igual ao do processo chamador.
- 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 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:

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.