Hur man använder execvp() i C och C++
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[]);cconst 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ökerexecvpefter 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 enNULLpekare för att ange slutet på argumentlistan. Den första posten iargvä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;
}cMed 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;
}cI 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.

