La fonction execvp en C
-
Utiliser la fonction
execvp
pour remplacer une image de processus en C -
Manipuler correctement les scénarios d’erreur des appels de fonction
execvp
et produire les messages correspondants -
Utilisez
execvp
avec la fonctionfork
pour créer un processus fils et exécuter un programme différent 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);
}
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