Die execvp Funktion in C

Jinku Hu 12 Oktober 2023
  1. Verwendung der Funktion execvp zum Ersetzen eines Prozessabbilds in C
  2. Ordnungsgemäße Behandlung von Fehlerszenarien beim Funktionsaufruf execvp und Ausgabe entsprechender Meldungen
  3. Verwenden Sie execvp mit der Funktion fork, um einen Kindprozess zu erzeugen und ein anderes Programm in C auszuführen
Die execvp Funktion in C

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

Verwandter Artikel - C Process