====== Função wait ====== Sintaxe: ''#include '' ''#include '' ''[[tipos_dados|pid_t]] wait([[tipos_dados|int]] * iStatus);'' ---- 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 seu ''status''. Quando um filho termina, o sistema operacional enviar um sinal [[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:: * ''WIFEXITED(*iStatus)'' – Retorna verdadeiro caso o processo filho tenha terminado normalmente através da chamada das funções [[exit]] ou [[_exit]]. * ''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 [[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 [[sinal|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\\. * ''WSTOPSIG(*iStatus)'' – Caso o processo filho tenha sido parado por um [[sinal]], esta macro retorna o número do [[sinal]] que parou o processo filho. Para testar o programa, utilize o comando [[kill] do sistema operacional para enviar vários [[sinal|sinais]] ao processo filho. #include #include #include #include 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.eti.br|Marcos Laureano]] 2009/02/22 04:59//