Ferramentas do usuário

Ferramentas do site


wait

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:

  • 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 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 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\\.
  • 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 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

wait.txt · Última modificação: 2023/09/12 16:14 por 127.0.0.1