# Kaip naudoti execvp() C ir C++ kalbose

Naudojant `execvp`, programa gali inicijuoti sistemos komandas, pvz., paleisti programas ar vykdyti sistemos paslaugas. Kartu su `fork()` funkcija kodas taip pat gali būti iškviečiamas po `execvp`.

## Kaip veikia `execvp`?

Pagrindinis `execvp` tikslas – leisti vienai programai valdyti kitą, nepradedant viso proceso iš naujo. Tai leidžia sklandžiai pereiti iš vienos funkcijos į kitą arba vykdyti išorines komandas su kintamais argumentais. `execvp` veikia kaip nematomas režisierius, keisdamas scenografiją ir peršokdamas iš vienos siužeto linijos į kitą.

Dinaminis proceso vykdymas leidžia jums koreguoti programos kelią ir jos argumentus vykdymo metu. Funkcija `execvp()` naudojama sistemos iškvietimuose, kurie reikalauja sudėtingų užduočių, tokių kaip scenarijų vykdymas, sistemos komandos, vamzdynų ir nukreipimų. Tai žymiai padidina C programų lankstumą.

## Kokia yra `execvp` sintaksė?

`execvp` funkcija reikalauja dviejų parametrų: failo kelio arba programos, kurią norite vykdyti, pavadinimo ir styginių masyvo su tos programos argumentais.

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

- **`const char *command`**: Tai yra failo kelias arba programos, kurią norite vykdyti, pavadinimas. Tai gali būti absoliutus kelias arba santykinis kelias. Jei naudojamas santykinis kelias, `execvp` ieško failo sistemos PATH.
- **`char *argv[]`**: Styginių masyvas, kuriame yra vykdytinos programos argumentai. Masyvas turi baigtis `NULL` rodykle, nurodanti argumentų sąrašo pabaigą. Pirmasis įrašas `argv` paprastai yra pačios programos pavadinimas, po kurio eina argumentai.

`execvp` funkcija ir kitos `exec` šeimos funkcijos yra būdingos **Unix pagrįstoms operacinėms sistemoms**. `#include <unistd.h>` teiginys yra C programavimo kalbos antraštės failas, kuriame yra funkcijų, skirtų sąveikai su Unix pagrįsta operacine sistema ir procesų kontrole, apibrėžimai ir deklaracijos. Mokydamiesi rašyti kodą C kalba, su šiuo failu susidursite labai dažnai.

## Pavyzdys, kaip naudoti `execvp`

Šiame pavyzdyje mes naudosime `execvp()` funkciją iš unistd.h antraštės failo, kad paleistume išorinę programą `ls` su argumentais `-l` ir `/usr/bin`. Masyvas `args` reiškia programos argumentus. Jei `execvp()` funkcija bus sėkminga, dabartinis procesas bus pakeistas išorine programa, o kitos eilutės bus ignoruojamos. Jei įvyks klaida, per `perror` bus parodytas klaidos pranešimas, o programa grąžins būsenos kodą 1.

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

Naudodami `fork()`, galite sukurti naują procesą. Šiame vaiko procese galite paleisti kitą programą naudodami `execvp`. Tai leidžia tėviniam procesui toliau vykdyti savo kodą, o naujasis procesas paleidžia išorinę 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;
}
```

Pateiktame pavyzdyje sukūrėme naują procesą, naudodami `fork()`. Naudodami `execvp()` funkciją, `ls` perima vaiko procesą su jo argumentais. Naudodami `waitpid`, tėvų procesas laukia, kol vaiko procesas bus baigtas, ir tada išveda pranešimą.


This is a markdown version of: [https://www.ionos.com/lt-lt/digitalguide/interneto-svetaines/interneto-svetainiu-kurimas/execvp/](https://www.ionos.com/lt-lt/digitalguide/interneto-svetaines/interneto-svetainiu-kurimas/execvp/) for AI/LLM consumption.