Função wait em C

Jinku Hu 12 outubro 2023
  1. Use a função wait para aguardar a mudança de estado em processos filho em C
  2. Use a função waitpid para aguardar a mudança de estado em processo filho específico em C
Função wait em C

Este artigo demonstrará vários métodos sobre como usar a função wait em C.

Use a função wait para aguardar a mudança de estado em processos filho em C

A função wait é um wrapper para chamada de sistema compatível com POSIX, definida no arquivo de cabeçalho <sys/wait.h>. A função é usada para esperar por mudanças de estado do programa em processos filhos e recuperar as informações correspondentes. wait é normalmente chamado após a chamada de sistema fork que cria um novo processo filho. A chamada wait suspende o programa de chamada até que um de seus processos filho seja encerrado.

O usuário deve estruturar o código de forma que haja dois caminhos diferentes para um processo de chamada e o processo filho. Geralmente é realizado com a instrução if...else que avalia o valor de retorno da chamada da função fork. Observe que fork retorna o ID do processo filho, um inteiro positivo, no processo pai e retorna 0 no processo filho. fork retornará -1 se a chamada falhar.

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
  pid_t c_pid = fork();

  if (c_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (c_pid == 0) {
    printf("printed from child process %d", getpid());
    exit(EXIT_SUCCESS);
  } else {
    printf("printed from parent process %d\n", getpid());
    wait(NULL);
  }

  exit(EXIT_SUCCESS);
}

Use a função waitpid para aguardar a mudança de estado em processo filho específico em C

waitpid é uma versão ligeiramente aprimorada da função wait que fornece o recurso de esperar pelo processo filho específico e modificar o comportamento de acionamento de retorno. waitpid pode retornar se o processo filho foi interrompido ou continuado adicionalmente ao caso em que o filho é encerrado.

No exemplo a seguir, chamamos a função pause do processo filho, que vai hibernar até que o sinal seja recebido. Por outro lado, o processo pai chama a função waitpid e suspende a execução até que o filho retorne. Ele também usa as macros WIFEXITED e WIFSIGNALED para verificar se a criança é encerrada normalmente ou encerrada pelo sinal, respectivamente, e depois imprime a mensagem de status correspondente no console.

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
  pid_t child_pid, wtr;
  int wstatus;

  child_pid = fork();
  if (child_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (child_pid == 0) {
    printf("Child PID is %d\n", getpid());
    pause();
    _exit(EXIT_FAILURE);
  } else {
    wtr = waitpid(child_pid, &wstatus, WUNTRACED | WCONTINUED);
    if (wtr == -1) {
      perror("waitpid");
      exit(EXIT_FAILURE);
    }

    if (WIFEXITED(wstatus)) {
      printf("exited, status=%d\n", WEXITSTATUS(wstatus));
    } else if (WIFSIGNALED(wstatus)) {
      printf("killed by signal %d\n", WTERMSIG(wstatus));
    }
  }
  exit(EXIT_SUCCESS);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C Process