La fonction execvp en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction execvp pour remplacer une image de processus en C
  2. Manipuler correctement les scénarios d’erreur des appels de fonction execvp et produire les messages correspondants
  3. Utilisez execvp avec la fonction fork pour créer un processus fils et exécuter un programme différent en C
La fonction execvp en C

Cet article présente plusieurs méthodes pour utiliser la fonction execvp en C.

Utiliser la fonction execvp pour remplacer une image de processus en C

Dans les systèmes basés sur Unix, il y a deux appels de système distincts pour créer un nouveau processus et pour charger un nouveau code de programme dans un processus en cours. Ce dernier est réalisé en utilisant la famille de fonctions de bibliothèque exec qui ne sont que des interfaces différentes de l’appel système execve. Il existe 6 prototypes de fonctions différents : execlp, execle, execv, execvp et execvpe. Ces fonctions prennent comme premier argument un nom de fichier ou un chemin d’accès à un nouveau fichier de programme à charger et à exécuter. Le paramètre execvp prend également un tableau d’arguments de programme comme deuxième argument.

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

Manipuler correctement les scénarios d’erreur des appels de fonction execvp et produire les messages correspondants

Notez que les fonctions de la famille exec ne retournent que si une erreur se produit, il est donc important d’implémenter des routines de vérification des erreurs et de gérer les chemins de code correspondants selon les besoins.
Parmi elles, execvp renvoie -1 en cas d’échec, et il définit également la variable errno. Notez cependant que errno doit être explicitement mis à 0 avant l’appel de la fonction et ne doit vérifier la valeur qu’une fois que l’appel donné est renvoyé. La fonction execvp peut prendre le nom du fichier sans slashes, ce qui implique que le fichier est recherché dans les répertoires comme spécifié par la variable d’environnement 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);
}

Utilisez execvp avec la fonction fork pour créer un processus fils et exécuter un programme différent en C

Supposons également que l’utilisateur doive créer un nouveau processus et exécuter le code de programme donné. Dans ce cas, nous pouvons utiliser l’appel de fonction fork combiné avec execvp. Fork duplique le processus appelant et en crée un nouveau appelé - le processus fils. Dans l’exemple suivant, nous avons implémenté un wrapper de fonction personnalisé pour créer un nouveau processus et charger/exécuter le code de programme donné. Notez qu’une fois qu’un processus enfant est créé, il exécute un code différent et le processus parent attend que le processus enfant se termine.

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

Article connexe - C Process