Med execvp kan et program starte sy­stem­kom­man­do­er, såsom at starte ap­pli­ka­tio­ner eller udføre sy­stemtje­ne­ster. Når det kom­bi­ne­res med fork(), kan koden også kaldes efter execvp.

Hvordan fungerer execvp?

Ho­ved­for­må­let med execvp er at give et program mulighed for at styre et andet uden at genstarte hele processen. Dette muliggør pro­blem­fri skift mellem for­skel­li­ge funk­tio­ner eller udførelse af eksterne kom­man­do­er med variable ar­gu­men­ter. execvp fungerer som en usynlig in­struk­tør, der skifter kulisse og springer frem og tilbage mellem for­skel­li­ge historier.

Dynamisk pro­ces­ud­fø­rel­se giver dig mulighed for at justere pro­gramstien og dens ar­gu­men­ter under kørsel. Funk­tio­nen execvp() bruges i sy­stem­kald, der kræver komplekse opgaver såsom scrip­tud­fø­rel­se, sy­stem­kom­man­do­er, pipe­li­ning og om­di­ri­ge­rin­ger. Det forbedrer flek­si­bi­li­te­ten i C-pro­gram­mer be­ty­de­ligt.

Hvad er syntaksen for execvp?

Funk­tio­nen execvp kræver to parametre: filstien eller navnet på det program, du vil køre, og en række strenge med ar­gu­men­ter­ne til det på­gæl­den­de program.

#include <unistd.h>
int execvp(const char *command, char* argv[]);
c
  • const char *command: Dette er filstien eller navnet på det program, du vil køre. Det kan være en absolut sti eller en relativ sti. Hvis der bruges en relativ sti, execvp søger efter filen i systemets PATH.
  • char *argv[]: En række strenge, der in­de­hol­der ar­gu­men­ter­ne for det program, der skal køres. Rækken skal slutte med en NULL pointer for at angive slut­nin­gen af ar­gu­ment­lis­ten. Den første post i argv er normalt navnet på selve pro­gram­met ef­ter­fulgt af ar­gu­men­ter­ne.

Funk­tio­nen execvp og andre funk­tio­ner fra familien exec er spe­ci­fik­ke for Unix-baserede ope­ra­tiv­sy­ste­mer. Sætningen #include <unistd.h> er en header-fil i C-pro­gram­me­ring, der in­de­hol­der de­fi­ni­tio­ner og de­kla­ra­tio­ner af funk­tio­ner til in­ter­ak­tion med et Unix-baseret ope­ra­tiv­sy­stem og pro­ces­sty­ring. Du vil støde på denne fil mange gange, når du lærer at skrive kode i C.

Eksempel på brug af execvp

I eksemplet nedenfor bruger vi funk­tio­nen execvp() fra he­a­der­fi­len unistd.h til at starte det eksterne program ls med ar­gu­men­ter­ne -l og /usr/bin. Arrayet args står for pro­gram­mets ar­gu­men­ter. Hvis funk­tio­nen execvp() lykkes, erstattes den aktuelle proces af det eksterne program, og de ef­ter­føl­gen­de linjer ignoreres. I tilfælde af en fejl vises en fejl­med­del­el­se via perror, og pro­gram­met re­tur­ne­rer sta­tus­ko­den 1.

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

Ved hjælp af fork() kan du oprette en ny proces. I denne un­der­pro­ces kan du køre et andet program ved hjælp af execvp. Dette gør det muligt for over­pro­ces­sen at fortsætte med at udføre sin egen kode, mens den nye proces starter det eksterne 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

I eksemplet ovenfor oprettede vi en ny proces ved hjælp af fork(). Ved hjælp af funk­tio­nen execvp() overtager ls un­der­pro­ces­sen med dens ar­gu­men­ter. Med waitpid venter over­pro­ces­sen på, at un­der­pro­ces­sen afsluttes, og udskriver derefter med­del­el­sen.

Gå til ho­ved­me­nu­en