execvp abil saab programm käivitada süs­tee­mi­käsklusi, näiteks ra­ken­duste käi­vi­ta­mine või süs­tee­mi­tee­nuste täitmine. Kom­bi­nee­ri­tuna funkt­sioo­niga fork() saab koodi kutsuda ka pärast execvp.

Kuidas execvp töötab?

execvp peamine eesmärk on või­mal­dada ühel prog­ram­mil teist juhtida ilma kogu protsessi uuesti käi­vi­ta­mata. See võimaldab sujuvat üle­mi­ne­kut erinevate funkt­sioo­nide vahel või muutuvate ar­gu­men­ti­dega väliste käskude täitmist. execvp toimib nagu nähtamatu lavastaja, muutes stseeni ja hüppades edasi-tagasi erinevate lugude vahel.

Dü­naa­mi­line protsessi täitmine võimaldab teil programmi teekonda ja selle argumente täitmise ajal kohandada. Funkt­siooni execvp() ka­su­ta­takse süs­tee­mi­kut­su­des, mis nõuavad keerukaid üles­an­deid, nagu skriptide täitmine, süs­tee­mi­kä­sud, to­rus­ta­mine ja üm­ber­suu­na­mised. See suurendab oluliselt C-prog­rammide paind­lik­kust.

Mis on execvp süntaks?

Funkt­sioon execvp vajab kahte pa­ra­meet­rit: faili tee või programmi nimi, mida soovite käivitada, ja stringide massiiv, mis sisaldab selle programmi argumente.

#include <unistd.h>
int execvp(const char *command, char* argv[]);
c
  • const char *command: See on faili tee või programmi nimi, mida soovite käivitada. See võib olla ab­so­luutne või suhteline tee. Kui ka­su­ta­takse suhtelist teed, otsib execvp faili süsteemi PATH-ist.
  • char *argv[]: Stringide massiiv, mis sisaldab käi­vi­ta­tava programmi argumente. Massiiv peab lõppema NULL viitega, mis näitab ar­gu­men­tide loendi lõppu. Esimene kirje argv on ta­va­li­selt programmi nimi, millele järgnevad ar­gu­men­did.

Funkt­sioon execvp ja teised funkt­sioo­nid pe­re­kon­nast exec on spet­sii­fi­li­sed Unix-põhiste ope­rat­sioo­ni­süs­teemide jaoks. Avaldus #include <unistd.h> on C-keele prog­ram­mee­ri­mise peal­kir­ja­fail, mis sisaldab funkt­sioo­nide de­fi­nit­sioone ja dek­la­rat­sioone suht­le­miseks Unix-põhise ope­rat­sioo­ni­süs­teemi ja prot­ses­side juh­ti­mi­sega. Seda faili kohtate sageli, kui õpite C-keeles koodi kirjutama.

Näide ka­su­ta­mise kohta execvp

Allpool toodud näites kasutame unistd.h päise­faili funkt­siooni execvp(), et käivitada vä­lis­prog­ramm ls ar­gu­men­ti­dega -l ja /usr/bin. Massiiv args tähistab programmi argumente. Kui funkt­sioon execvp() on edukas, asen­da­takse praegune protsess vä­lis­prog­ram­miga ja järgmisi ridu ig­no­ree­ri­takse. Vea korral kuvatakse veateade perror kaudu ja programm tagastab staa­tus­koodi 1.

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

fork() abil saate luua uue protsessi. Selles alam­prot­ses­sis saate execvp abil käivitada teise programmi. See võimaldab va­nem­prot­ses­sil jätkata oma koodi täitmist, samal ajal kui uus protsess käivitab välise programmi.

#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

Eespool toodud näites lõime uue protsessi, kasutades fork(). Funkt­siooni execvp() abil võtab ls üle alam­prot­sessi koos selle ar­gu­men­ti­dega. waitpid abil ootab va­nem­prot­sess alam­prot­sessi lõ­pe­ta­mist ja väljastab seejärel sõnumi.

Go to Main Menu