# Kā lietot execvp() C un C++ valodā

Ar `execvp` programma var iniciēt sistēmas komandas, piemēram, sākt lietojumprogrammas vai izpildīt sistēmas pakalpojumus. Kombinācijā ar `fork()` funkciju kodu var izsaukt arī pēc `execvp`.

## Kā darbojas `execvp`?

`execvp` galvenais mērķis ir ļaut vienai programmai kontrolēt citu, nepārstartējot visu procesu. Tas ļauj vienmērīgi pārslēgties starp dažādām funkcijām vai izpildīt ārējās komandas ar mainīgiem argumentiem. `execvp` darbojas kā neredzams režisors, mainot dekorācijas un pārlēcot starp dažādām sižeta līnijām.

Dinamiska procesa izpilde ļauj jums pielāgot programmas ceļu un tās argumentus izpildes laikā. Funkcija `execvp()` tiek izmantota sistēmas izsaukumos, kas prasa sarežģītas darbības, piemēram, skripta izpildi, sistēmas komandas, cauruļvadu izveidi un pāradresāciju. Tā ievērojami uzlabo C programmu elastīgumu.

## Kāda ir `execvp` sintakse?

Funkcijai `execvp` ir nepieciešami divi parametri: faila ceļš vai izpildāmās programmas nosaukums un virkne ar argumentiem šai programmai.

```c
#include <unistd.h>
int execvp(const char *command, char* argv[]);
```

- **`const char *command`**: Tas ir faila ceļš vai programmas 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 argumentus izpildāmajai programmai. Masīvam jābeidzas ar `NULL` rādītāju, kas norāda argumentu saraksta beigas. Pirmais ieraksts `argv` parasti ir pašas programmas nosaukums, kam seko argumenti.

`execvp` funkcija un citas funkcijas no `exec` ģimenes ir specifiskas **Unix bāzes operētājsistēmām**. `#include <unistd.h>` izteikums ir C programmēšanas galvenes fails, kas satur definīcijas un deklarācijas funkcijām, kas mijiedarbojas ar Unix bāzes operētājsistēmu un procesu kontroli. Jūs bieži saskarsies ar šo failu, apgūstot C valodas koda rakstīšanu.

## Piemērs, kā lietot `execvp`

Šajā piemērā mēs izmantosim funkciju `execvp()` no galvenes faila unistd.h, lai palaistu ārējo programmu `ls` ar argumentiem `-l` un `/usr/bin`. Masīvs `args` apzīmē programmas argumentus. Ja funkcija `execvp()` ir veiksmīga, pašreizē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, izmantojot `perror`, un programma atgriezīs statusa kodu 1.

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

Izmantojot `fork()`, varat izveidot jaunu procesu. Šajā apakšprocesā varat palaist citu programmu, izmantojot `execvp`. Tas ļauj galvenajam procesam turpināt izpildīt savu kodu, kamēr jaunais process palaista ārējo programmu.

```c
#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;
}
```

Iepriekš minētajā piemērā mēs izveidojām jaunu procesu, izmantojot `fork()`. Izmantojot `execvp()` funkciju, `ls` pārņem bērna procesu ar tā argumentiem. Ar `waitpid` vecākais process gaida, līdz bērna process pabeidz darbu, un pēc tam izvada ziņojumu.


This is a markdown version of: [https://www.ionos.com/lv-lv/digitalguide/timekla-vietnes/timekla-izstrade/execvp/](https://www.ionos.com/lv-lv/digitalguide/timekla-vietnes/timekla-izstrade/execvp/) for AI/LLM consumption.