Função wait
Sintaxe:
#include <sys/types.h>
#include <sys/wait.h>
O processo pai pode esperar o término de um processo filho através da chamada da função wait
. A função wait
devolverá o status
de retorno de qualquer processo filho que termine. O processo que chamar a função apresentará um dos seguintes comportamentos:
- Bloquear a sua execução até o término de algum processo filho.
- Retornar imediatamente com o
status
de término de um processo filho caso o filho tenha já terminado (zumbi) e esteja esperando o processo pai receber o seustatus
. Quando um filho termina, o sistema operacional enviar um sinal SIGCHLD para o pai. - Retornar imediatamente com um erro caso não se tenha nenhum processo filho rodando.
A função retornará, além do status
de término no parâmetro, o PID do processo filho que terminou. Desta forma é possível controlar os múltiplos filhos criados.
O status
retornado pela função, apesar de ser um número inteiro, possuirá informações codificadas indicando se o processo terminou normalmente ou cancelou e o código de retorno do processo. O arquivo sys/wait.h
contém um conjunto de macros, para testar-se o motivo do término do processo filho, bem como para se obter o código de retorno caso o processo tenha sido terminado normalmente ou o número do sinal caso o processo tenha sido cancelado.
As macros para se testar o motivo do término::
WIFSIGNALED(*iStatus)
– Retorna verdadeiro caso o processo filho tenha terminado através do recebimento de um sinal.WIFSTOPPED(*iStatus)
– Retorna verdadeiro caso o processo filho tenha recebido um sinal SIGSTOP (stop).
Para obter-se o status de término deve-se usar as seguintes macros:
WEXITSTATUS(*iStatus)
– Caso o processo tenha terminado normalmente, esta macro retorna o código de retorno do processo filho.WTERMSIG(*iStatus)
– Caso o processo tenha sido cancelado por um sinal, esta macro retorna o número do sinal que cancelou o processo filho.WCOREDUMP(*iStatus)
– Caso o processo tenha sido cancelado por um sinal, esta macro irá retornar verdadeiro caso o processo filho em seu cancelamento tenha gerado um \\core dump\\.
Para testar o programa, utilize o comando sinais ao processo filho.
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(void) { pid_t iPid; int iStatus; if( (iPid = fork())<0) /* cria um processo filho */ { perror("Erro no fork"); return 0; } if( iPid != 0) /* no processo pai*/ { printf("\nCriado o processo %d", iPid); while(1) { printf("\nEsperando o status do filho."); wait(&iStatus); printf("\nStatus do filho pego."); if( WIFEXITED(iStatus) ) { printf("\nFilho terminou normalmente"); printf("\nO status de término foi %d.", WEXITSTATUS(iStatus)); break; } if( WIFSIGNALED(iStatus) ) { printf("\nFilho recebeu sinal e terminou"); printf("\nO sinal que terminou o filho foi %d.", WTERMSIG(iStatus)); break; } if( WIFSTOPPED(iStatus) ) { printf("\nFilho recebeu sinal stop"); printf("\nO sinal que parou o filho foi %d.", WSTOPSIG(iStatus)); } } } else /* no processo filho */ { /* fica em loop esperando um sinal via comando kill ou ate terminar */ int i; printf("\nFilho %d em execucao", getpid()); for(i=0;i<20;i++) { printf("\nFilho faltam %d segundos para terminar.", 20-i); sleep(1); } } return 0; }
— Marcos Laureano 2009/02/22 04:59