Ar execvp programma var iniciēt sistēmas komandas, piemēram, sākt lie­to­jum­prog­ram­mas vai izpildīt sistēmas pa­kal­po­ju­mus. Kom­bi­nā­ci­jā ar fork() funkciju kodu var izsaukt arī pēc execvp.

Kā darbojas execvp?

execvp galvenais mērķis ir ļaut vienai prog­ram­mai kontrolēt citu, ne­pār­star­tē­jot visu procesu. Tas ļauj vien­mē­rī­gi pār­slēg­ties starp dažādām funkcijām vai izpildīt ārējās komandas ar mainīgiem ar­gu­men­tiem. execvp darbojas kā neredzams režisors, mainot de­ko­rā­ci­jas un pārlēcot starp dažādām sižeta līnijām.

Dinamiska procesa izpilde ļauj jums pielāgot prog­ram­mas ceļu un tās ar­gu­men­tus izpildes laikā. Funkcija execvp() tiek izmantota sistēmas iz­sau­ku­mos, kas prasa sa­rež­ģī­tas darbības, piemēram, skripta izpildi, sistēmas komandas, cau­ruļ­va­du izveidi un pā­r­ad­re­sā­ci­ju. Tā ie­vē­ro­ja­mi uzlabo C programmu elas­tī­gu­mu.

Kāda ir execvp sintakse?

Funkcijai execvp ir ne­pie­cie­ša­mi divi parametri: faila ceļš vai iz­pil­dā­mās prog­ram­mas nosaukums un virkne ar ar­gu­men­tiem šai prog­ram­mai.

#include <unistd.h>
int execvp(const char *command, char* argv[]);
c
  • const char *command: Tas ir faila ceļš vai prog­ram­mas nosaukums, kuru vēlaties izpildīt. Tas var būt absolūts ceļš vai relatīvs ceļš. Ja tiek izmantots relatīvs ceļš, execvp meklē failu sistēmas PATH.
  • char *argv[]: Stingru masīvs, kas satur ar­gu­men­tus iz­pil­dā­ma­jai prog­ram­mai. Masīvam jābeidzas ar NULL rādītāju, kas norāda argumentu saraksta beigas. Pirmais ieraksts argv parasti ir pašas prog­ram­mas nosaukums, kam seko argumenti.

execvp funkcija un citas funkcijas no exec ģimenes ir spe­ci­fis­kas Unix bāzes ope­rē­tājsis­tē­mām. #include <unistd.h> izteikums ir C prog­ram­mē­ša­nas galvenes fails, kas satur de­fi­nī­ci­jas un dek­la­rā­ci­jas funkcijām, kas mi­jie­dar­bo­jas ar Unix bāzes ope­rē­tājsis­tē­mu un procesu kontroli. Jūs bieži sa­skar­sies ar šo failu, apgūstot C valodas koda rak­stī­ša­nu.

Piemērs, kā lietot execvp

Šajā piemērā mēs iz­man­to­sim funkciju execvp() no galvenes faila unistd.h, lai palaistu ārējo programmu ls ar ar­gu­men­tiem -l un /usr/bin. Masīvs args apzīmē prog­ram­mas ar­gu­men­tus. Ja funkcija execvp() ir veiksmīga, pa­šrei­zē­jais process tiks aizstāts ar ārējo programmu, un nākamās rindas tiks ignorētas. Kļūdas gadījumā tiks parādīts kļūdas ziņojums, iz­man­to­jot perror, un programma atgriezīs statusa kodu 1.

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

Iz­man­to­jot fork(), varat izveidot jaunu procesu. Šajā ap­akš­pro­ce­sā varat palaist citu programmu, iz­man­to­jot execvp. Tas ļauj gal­ve­na­jam procesam turpināt izpildīt savu kodu, kamēr jaunais process palaista ārējo programmu.

#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

Iepriekš minētajā piemērā mēs iz­vei­do­jām jaunu procesu, iz­man­to­jot fork(). Iz­man­to­jot execvp() funkciju, ls pārņem bērna procesu ar tā ar­gu­men­tiem. Ar waitpid vecākais process gaida, līdz bērna process pabeidz darbu, un pēc tam izvada ziņojumu.

Go to Main Menu