Kako uporabljati execvp() v C in C++
S execvp lahko program sproži sistemske ukaze, kot so zagon aplikacij ali izvajanje sistemskih storitev. V kombinaciji s funkcijo fork() se lahko koda pokliče tudi po execvp.
Kako deluje execvp?
Glavni namen execvp je omogočiti, da en program nadzira drugega, ne da bi bilo treba ponovno zagnati celoten proces. To omogoča nemoteno preklapljanje med različnimi funkcijami ali izvajanje zunanjih ukazov s spremenljivimi argumenti. execvp deluje kot nevidni režiser, ki spreminja kulise in skače med različnimi zgodbami.
Dinamično izvajanje procesov omogoča prilagajanje poti programa in njegovih argumentov med izvajanjem. Funkcija execvp() se uporablja v sistemskih klicih, ki zahtevajo zapletene naloge, kot so izvajanje skript, sistemski ukazi, pipelining in preusmeritve. To znatno poveča fleksibilnost programov v jeziku C.
Kakšna je sintaksa execvp?
Funkcija execvp potrebuje dva parametra: pot do datoteke ali ime programa, ki ga želite izvesti, in niz nizov z argumenti za ta program.
#include <unistd.h>
int execvp(const char *command, char* argv[]);cconst char *command: To je pot do datoteke ali ime programa, ki ga želite izvesti. Lahko je absolutna pot ali relativna pot. Če se uporabi relativna pot,execvppoišče datoteko v sistemski poti PATH.char *argv[]: Niz nizov, ki vsebuje argumente za program, ki ga želite izvesti. Niz se mora končati s kazalcemNULLoznačuje konec seznama argumentov. Prvi vnos vargvje običajno ime samega programa, ki mu sledijo argumenti.
Funkcija execvp in druge funkcije iz družine exec so specifične za operacijske sisteme, ki temeljijo na Unixu. Izjava #include <unistd.h> je glava datoteke v programskem jeziku C, ki vsebuje definicije in deklaracije funkcij za interakcijo z operacijskim sistemom, ki temelji na Unixu, in nadzorom procesov. S to datoteko se boste pogosto srečevali, ko se boste učili pisati kodo v jeziku C.
Primer uporabe execvp
V spodnjem primeru bomo uporabili funkcijo execvp() iz datoteke glave unistd.h, da z argumentoma -l in /usr/bin zaženemo zunanji program ls. Niz args predstavlja argumente programa. Če je funkcija execvp() uspešna, bo trenutni proces nadomeščen z zunanjim programom, naslednje vrstice pa bodo prezrte. V primeru napake se bo prek perror prikazalo sporočilo o napaki, program pa bo vrnil statusno kodo 1.
#include <unistd.h>
int main() {
char *args[] = {"ls", "-l", "/usr/bin", NULL};
execvp("ls", args);
perror("execvp");
return 1;
}cZ uporabo fork() lahko ustvarite nov proces. V tem podrejenem procesu lahko z uporabo execvp zaženete drug program. To omogoča, da nadrejeni proces nadaljuje z izvajanjem lastne kode, medtem ko novi proces zažene zunanji program.
#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;
}cV zgornjem primeru smo ustvarili nov proces z uporabo fork(). S pomočjo funkcije execvp(), ls prevzame podrejeni proces z njegovimi argumenti. S waitpid starševski proces počaka, da se podrejeni proces zaključi, nato pa izpiše sporočilo.