La función execvp en C

Jinku Hu 12 octubre 2023
  1. Usar la función execvp para reemplazar la imagen de un proceso en C
  2. Maneje adecuadamente los escenarios de error de la llamada a la función execvp y emita los mensajes correspondientes
  3. Utilice execvp con la función fork para crear un proceso hijo y ejecutar un programa diferente en C
La función execvp en C

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

Usar la función execvp para reemplazar la imagen de un proceso en C

En los sistemas basados en Unix, hay dos llamadas al sistema separadas para crear un nuevo proceso y para cargar un nuevo código de programa en un proceso en ejecución. Esto último se hace utilizando la familia de funciones de la biblioteca exec que no son más que diferentes interfaces de la llamada al sistema execve. Hay 6 prototipos de funciones diferentes: execlp, execle, execv, execvp y execvpe. Estas funciones toman como primer argumento un nombre de archivo o una ruta de un nuevo archivo de programa para cargar y ejecutar. execvp también toma un array de argumentos de programa como segundo argumento.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  const char *args[] = {"vim", "/home/ben/tmp3.txt", NULL};

  execvp("vim", args);

  exit(EXIT_SUCCESS);
}

Maneje adecuadamente los escenarios de error de la llamada a la función execvp y emita los mensajes correspondientes

Tenga en cuenta que, las funciones de la familia exec sólo devuelven si se produce un error, por lo que es importante implementar rutinas de comprobación de errores y manejar las rutas de código correspondientes según sea necesario.
Entre ellas, execvp devuelve -1 en caso de fallo, y también establece la variable errno. Tenga en cuenta, sin embargo, que errno debe establecerse explícitamente a 0 antes de la llamada a la función y sólo comprobar el valor una vez que la llamada dada regrese. La función execvp puede tomar un nombre de fichero sin barras, lo que implica que el fichero se busca en los directorios especificados por la variable de entorno PATH.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  const char *args[] = {"vim", "/home/ben/tmp3.txt", NULL};

  errno = 0;
  if (execvp("vim", args) == -1) {
    if (errno == EACCES)
      printf("[ERROR] permission is denied for a file\n");
    else
      perror("execvp");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}

Utilice execvp con la función fork para crear un proceso hijo y ejecutar un programa diferente en C

Alternativamente, supongamos que el usuario necesita crear un nuevo proceso y ejecutar el código del programa dado. En ese caso, podemos utilizar la llamada a la función fork combinada con execvp. La función fork duplica el proceso que llama y crea uno nuevo llamado - el proceso hijo. En el siguiente ejemplo, implementamos una función personalizada para crear un nuevo proceso y cargar/ejecutar el código del programa dado. Observe que una vez que el proceso hijo es creado, ejecuta un código diferente y el proceso padre espera hasta que el hijo salga.

#include <errno.h>
#include <stdio.h>
#include <stdlib.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) {
    printf("spawn child with pid - %d\n", ch_pid);
    return ch_pid;
  } else {
    execvp(program, arg_list);
    perror("execve");
    exit(EXIT_FAILURE);
  }
}

int main(void) {
  const char* args[] = {"vim", "/home/ben/tmp3.txt", NULL};

  pid_t child;
  int wstatus;

  child = spawnChild("vim", args);

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

  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