Med execvp kan ett program initiera systemkommandon, såsom att starta applikationer eller köra systemtjänster. När det kombineras med funktionen fork() kan kod också anropas efter execvp.

Hur fungerar execvp?

Huvudsyftet med execvp är att ett program ska kunna styra ett annat utan att hela processen behöver startas om. Detta möjliggör smidig växling mellan olika funktioner eller körning av externa kommandon med variabla argument. execvp fungerar som en osynlig regissör som byter scenografi och hoppar fram och tillbaka mellan olika berättelser.

Dynamisk processkörning gör det möjligt att justera programvägen och dess argument under körning. Funktionen execvp() används i systemanrop som kräver komplexa uppgifter såsom skriptkörning, systemkommandon, pipelining och omdirigeringar. Den förbättrar avsevärt flexibiliteten hos C-program.

Vad är syntaxen för execvp?

Funktionen execvp behöver två parametrar: filvägen eller namnet på det program du vill köra och en strängmatris med argumenten för det programmet.

#include <unistd.h>
int execvp(const char *command, char* argv[]);
c
  • const char *command: Detta är filvägen eller namnet på det program du vill köra. Det kan vara en absolut eller relativ sökväg. Om en relativ sökväg används söker execvp efter filen i systemets PATH.
  • char *argv[]: En strängmatris som innehåller argumenten för programmet som ska köras. Matrisen måste avslutas med en NULL pekare för att ange slutet på argumentlistan. Den första posten i argv är vanligtvis namnet på själva programmet, följt av argumenten.

Funktionen execvp och andra funktioner från familjen exec är specifika för Unix-baserade operativsystem. Uttrycket #include <unistd.h> är en huvudfil i C-programmering som innehåller definitioner och deklarationer av funktioner för interaktion med ett Unix-baserat operativsystem och processkontroll. Du kommer att stöta på den här filen ofta när du lär dig att skriva kod i C.

Exempel på hur man använder execvp

I exemplet nedan använder vi funktionen execvp() från huvudfilen unistd.h för att starta det externa programmet ls med argumenten -l och /usr/bin. Arrayen args står för programmets argument. Om funktionen execvp() lyckas kommer den aktuella processen att ersättas av det externa programmet och de efterföljande raderna ignoreras. Om ett fel uppstår visas ett felmeddelande via perror och programmet returnerar statuskoden 1.

#include <unistd.h>
int main() {
    char *args[] = {"ls", "-l", "/usr/bin", NULL};
    execvp("ls", args);
    perror("execvp");
    return 1;
}
c

Med fork() kan du skapa en ny process. I denna underprocess kan du köra ett annat program med execvp. Detta gör att överordnade processen kan fortsätta att exekvera sin egen kod, medan den nya processen startar det externa programmet.

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
    char* command = "ls";
    char *args[] = {"ls", "-l", "/usr/bin", NULL};
    printf("Before calling execvp()\n");
    pid_t child_pid = fork();
    if (child_pid == -1) {
        // Error creating the process
        perror("fork");
        return 1;
    }
    if (child_pid == 0) {
        // Code executed in the child process
        // Call execvp in the child process to execute "ls" with the specified arguments
        int status_code = execvp(command, args);
        // This line is reached if execvp encounters an error
        perror("execvp");
        // Print statement after execvp
        printf("ls -l /usr/bin has taken control of this child process. If this is printed, execvp encountered
       an error.\n");
        // Error handling in the child process
        return 1;
    } else {
        // Code executed in the parent process
        // Wait for the completion of the child process
        waitpid(child_pid, NULL, 0);
        printf("The child process has completed its execution.\n");
    }
    return 0;
}
c

I exemplet ovan skapade vi en ny process med fork(). Med hjälp av funktionen execvp() tar ls över underprocessen med dess argument. Med waitpid väntar överprocessen på att underprocessen ska slutföras och skriver sedan ut meddelandet.

Gå till huvudmeny