Kaip naudoti execvp() C ir C++ kalbose
Naudojant execvp, programa gali inicijuoti sistemos komandas, pvz., paleisti programas ar vykdyti sistemos paslaugas. Kartu su fork() funkcija kodas taip pat gali būti iškviečiamas po execvp.
Kaip veikia execvp?
Pagrindinis execvp tikslas – leisti vienai programai valdyti kitą, nepradedant viso proceso iš naujo. Tai leidžia sklandžiai pereiti iš vienos funkcijos į kitą arba vykdyti išorines komandas su kintamais argumentais. execvp veikia kaip nematomas režisierius, keisdamas scenografiją ir peršokdamas iš vienos siužeto linijos į kitą.
Dinaminis proceso vykdymas leidžia jums koreguoti programos kelią ir jos argumentus vykdymo metu. Funkcija execvp() naudojama sistemos iškvietimuose, kurie reikalauja sudėtingų užduočių, tokių kaip scenarijų vykdymas, sistemos komandos, vamzdynų ir nukreipimų. Tai žymiai padidina C programų lankstumą.
Kokia yra execvp sintaksė?
execvp funkcija reikalauja dviejų parametrų: failo kelio arba programos, kurią norite vykdyti, pavadinimo ir styginių masyvo su tos programos argumentais.
#include <unistd.h>
int execvp(const char *command, char* argv[]);cconst char *command: Tai yra failo kelias arba programos, kurią norite vykdyti, pavadinimas. Tai gali būti absoliutus kelias arba santykinis kelias. Jei naudojamas santykinis kelias,execvpieško failo sistemos PATH.char *argv[]: Styginių masyvas, kuriame yra vykdytinos programos argumentai. Masyvas turi baigtisNULLrodykle, nurodanti argumentų sąrašo pabaigą. Pirmasis įrašasargvpaprastai yra pačios programos pavadinimas, po kurio eina argumentai.
execvp funkcija ir kitos exec šeimos funkcijos yra būdingos Unix pagrįstoms operacinėms sistemoms. #include <unistd.h> teiginys yra C programavimo kalbos antraštės failas, kuriame yra funkcijų, skirtų sąveikai su Unix pagrįsta operacine sistema ir procesų kontrole, apibrėžimai ir deklaracijos. Mokydamiesi rašyti kodą C kalba, su šiuo failu susidursite labai dažnai.
Pavyzdys, kaip naudoti execvp
Šiame pavyzdyje mes naudosime execvp() funkciją iš unistd.h antraštės failo, kad paleistume išorinę programą ls su argumentais -l ir /usr/bin. Masyvas args reiškia programos argumentus. Jei execvp() funkcija bus sėkminga, dabartinis procesas bus pakeistas išorine programa, o kitos eilutės bus ignoruojamos. Jei įvyks klaida, per perror bus parodytas klaidos pranešimas, o programa grąžins būsenos kodą 1.
#include <unistd.h>
int main() {
char *args[] = {"ls", "-l", "/usr/bin", NULL};
execvp("ls", args);
perror("execvp");
return 1;
}cNaudodami fork(), galite sukurti naują procesą. Šiame vaiko procese galite paleisti kitą programą naudodami execvp. Tai leidžia tėviniam procesui toliau vykdyti savo kodą, o naujasis procesas paleidžia išorinę 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;
}cPateiktame pavyzdyje sukūrėme naują procesą, naudodami fork(). Naudodami execvp() funkciją, ls perima vaiko procesą su jo argumentais. Naudodami waitpid, tėvų procesas laukia, kol vaiko procesas bus baigtas, ir tada išveda pranešimą.