Función wait en C

Jinku Hu 12 octubre 2023
  1. Usar la función wait para esperar el cambio de estado de los procesos hijos en C
  2. Usar la función waitpid para esperar un cambio de estado en un proceso hijo específico en C
Función wait en C

Este artículo demostrará múltiples métodos sobre cómo usar la función wait en C.

Usar la función wait para esperar el cambio de estado de los procesos hijos en C

La función wait es una envoltura para la llamada al sistema compatible con POSIX, definida en el archivo de cabecera <sys/wait.h>. La función se utiliza para esperar los cambios de estado del programa en los procesos hijos y recuperar la información correspondiente. wait se llama normalmente después de la llamada al sistema fork que crea un nuevo proceso hijo. La llamada wait suspende el programa que llama hasta que uno de sus procesos hijos termine.

El usuario debe estructurar el código para que haya dos caminos diferentes para el proceso que llama y el proceso hijo. Normalmente se consigue con la sentencia if...else que evalúa el valor de retorno de la llamada a la función fork. Tenga en cuenta que fork devuelve el ID del proceso hijo, un entero positivo, en el proceso padre y devuelve 0 en el proceso hijo. fork devolverá -1 si la llamada falla.

#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);
}

Usar la función waitpid para esperar un cambio de estado en un proceso hijo específico en C

waitpid es una versión ligeramente mejorada de la función wait que proporciona la característica de esperar al proceso hijo específico y modificar el comportamiento de activación del retorno. waitpid puede devolver si el proceso hijo ha sido detenido o continuado adicionalmente al caso cuando el hijo es terminado.

En el siguiente ejemplo, llamamos a la función pause desde el proceso hijo, que pasa a dormir hasta que se recibe la señal. Por otro lado, el proceso padre llama a la función waitpid y suspende la ejecución hasta que el hijo regrese. También utiliza las macros WIFEXITED y WIFSIGNALED para comprobar si el proceso hijo ha terminado normalmente o ha terminado por la señal, respectivamente, y luego imprime el correspondiente mensaje de estado en la consola.

#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

Artículo relacionado - C Process