Naudojant execvp, programa gali ini­ci­juo­ti sistemos komandas, pvz., paleisti programas ar vykdyti sistemos paslaugas. Kartu su fork() funkcija kodas taip pat gali būti iš­kvie­čia­mas po execvp.

Kaip veikia execvp?

Pag­rin­di­nis execvp tikslas – leisti vienai programai valdyti kitą, ne­pra­de­dant viso proceso iš naujo. Tai leidžia sklan­džiai pereiti iš vienos funkcijos į kitą arba vykdyti išorines komandas su kintamais ar­gu­men­tais. execvp veikia kaip nematomas re­ži­sie­rius, keisdamas sce­no­gra­fi­ją ir per­šok­da­mas iš vienos siužeto linijos į kitą.

Dinaminis proceso vykdymas leidžia jums koreguoti programos kelią ir jos ar­gu­men­tus vykdymo metu. Funkcija execvp() naudojama sistemos iš­kvie­ti­muo­se, kurie rei­ka­lau­ja sudėtingų užduočių, tokių kaip scenarijų vykdymas, sistemos komandos, vamzdynų ir nu­krei­pi­mų. Tai žymiai padidina C programų lankstumą.

Kokia yra execvp sintaksė?

execvp funkcija rei­ka­lau­ja dviejų parametrų: failo kelio arba programos, kurią norite vykdyti, pa­va­di­ni­mo ir styginių masyvo su tos programos ar­gu­men­tais.

#include <unistd.h>
int execvp(const char *command, char* argv[]);
c
  • const char *command: Tai yra failo kelias arba programos, kurią norite vykdyti, pa­va­di­ni­mas. Tai gali būti ab­so­liu­tus kelias arba san­ty­ki­nis kelias. Jei nau­do­ja­mas san­ty­ki­nis kelias, execvp ieško failo sistemos PATH.
  • char *argv[]: Styginių masyvas, kuriame yra vyk­dy­ti­nos programos ar­gu­men­tai. Masyvas turi baigtis NULL rodykle, nurodanti argumentų sąrašo pabaigą. Pirmasis įrašas argv paprastai yra pačios programos pa­va­di­ni­mas, po kurio eina ar­gu­men­tai.

execvp funkcija ir kitos exec šeimos funkcijos yra būdingos Unix pa­grįs­toms ope­ra­ci­nėms sistemoms. #include <unistd.h> teiginys yra C prog­ra­ma­vi­mo kalbos antraštės failas, kuriame yra funkcijų, skirtų sąveikai su Unix pagrįsta operacine sistema ir procesų kontrole, api­brė­ži­mai ir dekla­ra­ci­jos. Mo­ky­da­mie­si rašyti kodą C kalba, su šiuo failu su­si­dur­si­te labai dažnai.

Pavyzdys, kaip naudoti execvp

Šiame pavyzdyje mes naudosime execvp() funkciją iš unistd.h antraštės failo, kad pa­leis­tu­me išorinę programą ls su ar­gu­men­tais -l ir /usr/bin. Masyvas args reiškia programos ar­gu­men­tus. Jei execvp() funkcija bus sėkminga, da­bar­ti­nis procesas bus pakeistas išorine programa, o kitos eilutės bus ig­no­ruo­ja­mos. Jei įvyks klaida, per perror bus parodytas klaidos pra­ne­ši­mas, 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;
}
c

Naudodami 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;
}
c

Pa­teik­ta­me pavyzdyje sukūrėme naują procesą, naudodami fork(). Naudodami execvp() funkciją, ls perima vaiko procesą su jo ar­gu­men­tais. Naudodami waitpid, tėvų procesas laukia, kol vaiko procesas bus baigtas, ir tada išveda pranešimą.

Go to Main Menu