Função wait

Sintaxe:

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(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:

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::

Para obter-se o status de término deve-se usar as seguintes macros:

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