S execvp lahko program sproži sistemske ukaze, kot so zagon aplikacij ali izvajanje sis­tem­skih storitev. V kom­bi­na­ci­ji 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 pre­kla­plja­nje med raz­lič­ni­mi funk­ci­ja­mi ali izvajanje zunanjih ukazov s spre­men­lji­vi­mi argumenti. execvp deluje kot nevidni režiser, ki spreminja kulise in skače med raz­lič­ni­mi zgodbami.

Dinamično izvajanje procesov omogoča pri­la­ga­ja­nje poti programa in njegovih ar­gu­men­tov med iz­va­ja­njem. Funkcija execvp() se uporablja v sis­tem­skih klicih, ki zahtevajo zapletene naloge, kot so izvajanje skript, sistemski ukazi, pi­pe­li­ning in pre­u­sme­ri­tve. To znatno poveča fle­ksi­bil­nost 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[]);
c
  • const 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, execvp poišč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 kazalcem NULL označuje konec seznama ar­gu­men­tov. Prvi vnos v argv je običajno ime samega programa, ki mu sledijo argumenti.

Funkcija execvp in druge funkcije iz družine exec so spe­ci­fič­ne za ope­ra­cij­ske sisteme, ki temeljijo na Unixu. Izjava #include <unistd.h> je glava datoteke v pro­gram­skem jeziku C, ki vsebuje de­fi­ni­ci­je in de­kla­ra­ci­je funkcij za in­te­rak­ci­jo z ope­ra­cij­skim 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 ar­gu­men­to­ma -l in /usr/bin zaženemo zunanji program ls. Niz args pred­sta­vlja argumente programa. Če je funkcija execvp() uspešna, bo trenutni proces na­do­me­šč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;
}
c

Z uporabo fork() lahko ustvarite nov proces. V tem po­dre­je­nem procesu lahko z uporabo execvp zaženete drug program. To omogoča, da nadrejeni proces nadaljuje z iz­va­ja­njem 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;
}
c

V zgornjem primeru smo ustvarili nov proces z uporabo fork(). S pomočjo funkcije execvp(), ls prevzame podrejeni proces z njegovimi argumenti. S waitpid star­še­vski proces počaka, da se podrejeni proces zaključi, nato pa izpiše sporočilo.

Go to Main Menu