Ferramentas do usuário

Ferramentas do site


wait

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.


wait [2023/09/12 16:14] (atual) – criada - edição externa 127.0.0.1
Linha 1: Linha 1:
 +====== Função wait ======
  
 +Sintaxe:
 +
 +''#include <sys/types.h>''
 +
 +''#include <sys/wait.h>''
 +
 +
 +''[[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.
 +<code c>
 +#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;
 +}
 +</code>
 +
 + --- //[[marcos@laureano.eti.br|Marcos Laureano]] 2009/02/22 04:59//
wait.txt · Última modificação: 2023/09/12 16:14 por 127.0.0.1