Die execvp Funktion in C
-
Verwendung der Funktion
execvp
zum Ersetzen eines Prozessabbilds in C -
Ordnungsgemäße Behandlung von Fehlerszenarien beim Funktionsaufruf
execvp
und Ausgabe entsprechender Meldungen -
Verwenden Sie
execvp
mit der Funktionfork
, um einen Kindprozess zu erzeugen und ein anderes Programm in C auszuführen
In diesem Artikel werden mehrere Methoden zur Verwendung der execvp
-Funktion in C vorgestellt.
Verwendung der Funktion execvp
zum Ersetzen eines Prozessabbilds in C
In Unix-basierten Systemen gibt es zwei getrennte Systemaufrufe, um einen neuen Prozess zu erzeugen und um einen neuen Programmcode in einen laufenden Prozess zu laden. Letzteres geschieht über die exec
-Familie von Bibliotheksfunktionen, die lediglich verschiedene Schnittstellen zum execve
-Systemaufruf darstellen. Es gibt 6 verschiedene Funktionsprototypen: execlp
, execle
, execv
, execvp
und execvpe
. Diese Funktionen nehmen als erstes Argument einen Dateinamen oder einen Pfadnamen einer neuen Programmdatei an, die geladen und ausgeführt werden soll. execvp
nimmt außerdem ein Array von Programmargumenten als zweites Argument an.
#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);
}
Ordnungsgemäße Behandlung von Fehlerszenarien beim Funktionsaufruf execvp
und Ausgabe entsprechender Meldungen
Beachten Sie, dass die Funktionen der exec
-Familie nur zurückkehren, wenn ein Fehler auftritt, daher ist es wichtig, Fehlerprüfroutinen zu implementieren und die entsprechenden Codepfade nach Bedarf zu behandeln.
Die Funktion execvp
unter ihnen gibt bei einem Fehler -1
zurück und setzt außerdem die Variable errno
. Beachten Sie aber, dass errno
vor dem Funktionsaufruf explizit auf 0 gesetzt werden sollte, und prüfen Sie den Wert erst, wenn der gegebene Aufruf zurückkehrt. Die Funktion execvp
kann Dateinamen ohne Schrägstriche annehmen, was bedeutet, dass die Datei in den Verzeichnissen gesucht wird, die durch die Umgebungsvariable PATH
festgelegt sind.
#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);
}
Verwenden Sie execvp
mit der Funktion fork
, um einen Kindprozess zu erzeugen und ein anderes Programm in C auszuführen
Angenommen, der Benutzer muss einen neuen Prozess erstellen und den angegebenen Programmcode ausführen. In diesem Fall können wir den Funktionsaufruf fork
in Kombination mit execvp
verwenden. Mit fork
wird der aufrufende Prozess dupliziert und ein neuer Prozess - der Kindprozess - erzeugt. Im folgenden Beispiel haben wir einen benutzerdefinierten Funktions-Wrapper implementiert, um einen neuen Prozess zu erstellen und den angegebenen Programmcode zu laden/auszuführen. Beachten Sie, dass ein Kindprozess, sobald er erstellt wurde, einen anderen Code ausführt und der Elternprozess wartet, bis der Kindprozess beendet wird.
#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