# Kako uporabljati execvp() v C in C++

S `execvp` lahko program sproži sistemske ukaze, kot so zagon aplikacij ali izvajanje sistemskih storitev. V kombinaciji 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 preklapljanje med različnimi funkcijami ali izvajanje zunanjih ukazov s spremenljivimi argumenti. `execvp` deluje kot nevidni režiser, ki spreminja kulise in skače med različnimi zgodbami.

Dinamično izvajanje procesov omogoča prilagajanje poti programa in njegovih argumentov med izvajanjem. Funkcija `execvp()` se uporablja v sistemskih klicih, ki zahtevajo zapletene naloge, kot so izvajanje skript, sistemski ukazi, pipelining in preusmeritve. To znatno poveča fleksibilnost 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.

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

- **`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 argumentov. Prvi vnos v `argv` je običajno ime samega programa, ki mu sledijo argumenti.

Funkcija `execvp` in druge funkcije iz družine `exec` so specifične za **operacijske sisteme, ki temeljijo na Unixu**. Izjava `#include <unistd.h>` je glava datoteke v programskem jeziku C, ki vsebuje definicije in deklaracije funkcij za interakcijo z operacijskim 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 argumentoma `-l` in `/usr/bin` zaženemo zunanji program `ls`. Niz `args` predstavlja argumente programa. Če je funkcija `execvp()` uspešna, bo trenutni proces nadomešč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.

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

Z uporabo `fork()` lahko ustvarite nov proces. V tem podrejenem procesu lahko z uporabo `execvp` zaženete drug program. To omogoča, da nadrejeni proces nadaljuje z izvajanjem lastne kode, medtem ko novi proces zažene zunanji program.

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

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ševski proces počaka, da se podrejeni proces zaključi, nato pa izpiše sporočilo.


This is a markdown version of: [https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/execvp/](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/execvp/) for AI/LLM consumption.