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.
#include <unistd.h>
int execvp(const char *command, char* argv[]);cconst 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ļš,execvpmeklē failu sistēmas PATH.char *argv[]: Stingru masīvs, kas satur argumentus izpildāmajai programmai. Masīvam jābeidzas arNULLrādītāju, kas norāda argumentu saraksta beigas. Pirmais ierakstsargvparasti 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.
#include <unistd.h>
int main() {
char *args[] = {"ls", "-l", "/usr/bin", NULL};
execvp("ls", args);
perror("execvp");
return 1;
}cIzmantojot 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.
#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;
}cIepriekš 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.