Usa la función fork en C

Jinku Hu 12 octubre 2023
  1. Utilice la función fork para crear un nuevo proceso en C
  2. Utilice una de las funciones exec para ejecutar un nuevo programa en el proceso hijo en C
Usa la función fork en C

Este artículo explicará varios métodos de cómo utilizar la función fork en C.

Utilice la función fork para crear un nuevo proceso en C

La función fork se utiliza para crear un nuevo proceso que represente la duplicación del proceso de la persona que llama. Tenga en cuenta que el proceso de llamada se denomina convencionalmente proceso padre y uno recién creado, proceso hijo. Aunque mencionamos anteriormente que el proceso hijo es un duplicado del padre, existen algunas diferencias, como que el proceso hijo tiene su propio PID único (los detalles completos sobre las diferencias se enumeran en el manual fork página).

En el siguiente ejemplo, implementamos un escenario simple donde se usa fork para ejecutar dos procesos al mismo tiempo. La primera instrucción if comprueba si se devuelve un código de error y continúa solo si la bifurcación tuvo éxito. La siguiente declaración if demuestra cómo estructurar el código para que lo ejecuten procesos concurrentes.

La llamada fork es un poco única en comparación con otras funciones, ya que regresa dos veces cuando tiene éxito - en el proceso padre y el hijo - devolviendo el PID del proceso hijo en el padre y el valor 0 en el hijo. Tenga en cuenta que especificamos las condiciones del bucle en consecuencia para distinguir diferentes rutas de código para procesos.

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

int main(void) {
  pid_t c_pid = fork();
  if (c_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

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

  exit(EXIT_SUCCESS);
}

Producción :

printed from parent process - 8485
printed from child process - 8486

Utilice una de las funciones exec para ejecutar un nuevo programa en el proceso hijo en C

Uno de los casos comunes para usar la función fork es ejecutar un nuevo programa en el proceso hijo, lo que se puede lograr agregando una de las funciones exec a la mezcla. En este caso, implementamos una función separada llamada spawnChild que crea un nuevo proceso y luego llama a execvp para ejecutar el programa dado. Elegimos un programa de línea de comandos ampliamente disponible: top para ejecutar en el proceso hijo. Tenga en cuenta que el proceso padre puede optar por esperar a que cambie el estado del proceso hijo utilizando waitpid.

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

pid_t spawnChild(const char* program, char** arg_list) {
  pid_t ch_pid = fork();
  if (ch_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (ch_pid == 0) {
    execvp(program, arg_list);
    perror("execve");
    exit(EXIT_FAILURE);
  } else {
    printf("spawned child with pid - %d\n", ch_pid);
    return ch_pid;
  }
}

int main(void) {
  int ret;
  const char* args[] = {"top", NULL, NULL};

  pid_t child;
  int wstatus;

  child = spawnChild("top", args);

  if (waitpid(child, &wstatus, WUNTRACED | WCONTINUED) == -1) {
    perror("waitpid");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}

Producción :

printed from child process - 8486
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