# Kuidas kasutada execvp() C- ja C++-keeles

`execvp` abil saab programm käivitada süsteemikäsklusi, näiteks rakenduste käivitamine või süsteemiteenuste täitmine. Kombineerituna funktsiooniga `fork()` saab koodi kutsuda ka pärast `execvp`.

## Kuidas `execvp` töötab?

`execvp` peamine eesmärk on võimaldada ühel programmil teist juhtida ilma kogu protsessi uuesti käivitamata. See võimaldab sujuvat üleminekut erinevate funktsioonide vahel või muutuvate argumentidega väliste käskude täitmist. `execvp` toimib nagu nähtamatu lavastaja, muutes stseeni ja hüppades edasi-tagasi erinevate lugude vahel.

Dünaamiline protsessi täitmine võimaldab teil programmi teekonda ja selle argumente täitmise ajal kohandada. Funktsiooni `execvp()` kasutatakse süsteemikutsudes, mis nõuavad keerukaid ülesandeid, nagu skriptide täitmine, süsteemikäsud, torustamine ja ümbersuunamised. See suurendab oluliselt C-programmide paindlikkust.

## Mis on `execvp` süntaks?

Funktsioon `execvp` vajab kahte parameetrit: faili tee või programmi nimi, mida soovite käivitada, ja stringide massiiv, mis sisaldab selle programmi argumente.

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

- **`const char *command`**: See on faili tee või programmi nimi, mida soovite käivitada. See võib olla absoluutne või suhteline tee. Kui kasutatakse suhtelist teed, otsib `execvp` faili süsteemi PATH-ist.
- **`char *argv[]`**: Stringide massiiv, mis sisaldab käivitatava programmi argumente. Massiiv peab lõppema `NULL` viitega, mis näitab argumentide loendi lõppu. Esimene kirje `argv` on tavaliselt programmi nimi, millele järgnevad argumendid.

Funktsioon `execvp` ja teised funktsioonid perekonnast `exec` on spetsiifilised **Unix-põhiste operatsioonisüsteemide** jaoks. Avaldus `#include <unistd.h>` on C-keele programmeerimise pealkirjafail, mis sisaldab funktsioonide definitsioone ja deklaratsioone suhtlemiseks Unix-põhise operatsioonisüsteemi ja protsesside juhtimisega. Seda faili kohtate sageli, kui õpite C-keeles koodi kirjutama.

## Näide kasutamise kohta `execvp`

Allpool toodud näites kasutame unistd.h päisefaili funktsiooni `execvp()`, et käivitada välisprogramm `ls` argumentidega `-l` ja `/usr/bin`. Massiiv `args` tähistab programmi argumente. Kui funktsioon `execvp()` on edukas, asendatakse praegune protsess välisprogrammiga ja järgmisi ridu ignoreeritakse. Vea korral kuvatakse veateade `perror` kaudu ja programm tagastab staatuskoodi 1.

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

`fork()` abil saate luua uue protsessi. Selles alamprotsessis saate `execvp` abil käivitada teise programmi. See võimaldab vanemprotsessil jätkata oma koodi täitmist, samal ajal kui uus protsess käivitab välise programmi.

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

Eespool toodud näites lõime uue protsessi, kasutades `fork()`. Funktsiooni `execvp()` abil võtab `ls` üle alamprotsessi koos selle argumentidega. `waitpid` abil ootab vanemprotsess alamprotsessi lõpetamist ja väljastab seejärel sõnumi.


This is a markdown version of: [https://www.ionos.com/et-ee/digitalguide/veebisaidid/veebiarendus/execvp/](https://www.ionos.com/et-ee/digitalguide/veebisaidid/veebiarendus/execvp/) for AI/LLM consumption.