| |
— | wait [2023/09/12 16:14] (atual) – criada - edição externa 127.0.0.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// |