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.
#include <unistd.h>
int execvp(const char *command, char* argv[]);cconst 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, otsibexecvpfaili süsteemi PATH-ist.char *argv[]: Stringide massiiv, mis sisaldab käivitatava programmi argumente. Massiiv peab lõppemaNULLviitega, mis näitab argumentide loendi lõppu. Esimene kirjeargvon 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.
#include <unistd.h>
int main() {
char *args[] = {"ls", "-l", "/usr/bin", NULL};
execvp("ls", args);
perror("execvp");
return 1;
}cfork() 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.
#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;
}cEespool 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.