logo

Execvp() funkcija C

Funkcija execvp () yra galingas sistemos iškvietimas C programavimo kalba, leidžiantis pakeisti esamą procesą nauju procesu, nurodytu pateiktoje komandoje. Tai yra unistd.h antraštės failo dalis ir dažniausiai naudojama Unix pagrindu veikiančiose operacinėse sistemose. Pavadinimas „execvp“ reiškia „vykdyti failą (su keliu)“ ir „kintamuosius argumentus (perduotą kaip masyvą)“.

Funkcijos execvp () sintaksė yra tokia:

 int execvp(const char *file, char *const argv[]); 

Failo parametras nurodo vykdytino failo pavadinimą arba kelią. Argv parametras yra simbolių rodyklių masyvas, nurodantis argumentus, kuriuos reikia perduoti naujam procesui. Paskutinis argv masyvo elementas turi būti nustatytas į NULL, kad būtų nurodyta argumentų sąrašo pabaiga.

Kai iškviečiamas execvp(), jis ieško nurodyto failo kataloguose, pateiktuose aplinkos kintamajame PATH. Jei failas randamas, dabartinis procesas pakeičiamas nauju procesu. Naujas procesas pradedamas vykdyti nuo nurodyto failo pradžios, o argumentai perduodami naujo proceso main() funkcijai.

Funkcija execvp() grąžina -1, jei vykdant įvyksta klaida. Tokiais atvejais errno kintamasis nustatomas taip, kad nurodytų konkrečią įvykusią klaidą. Įprastos klaidos yra failas nerastas, nepakankami leidimai arba neteisingi argumentai.

Vienas iš execvp() pranašumų yra tai, kad jis leidžia vykdyti programas nežinant tikslaus kelio į vykdomąjį failą. Ieškodama kintamojo PATH, funkcija automatiškai suranda vykdomojo failo vietą, supaprastindama kodą.

Štai funkcijos execvp() naudojimo pavyzdys:

 #include #include int main() { char *const argv[] = {'ls', '-l', NULL}; execvp('ls', argv); // The following code is executed only if execvp fails perror('execvp'); // Print error message return 1; } 

Šiame pavyzdyje komandą „ls“ vykdome su argumentu „-l“ naudodami execvp (). Jei pavyks, dabartinis procesas pakeičiamas komanda „ls“ ir rodoma komandos išvestis. Jei įvyksta klaida, iškviečiama funkcija perror() spausdinti klaidos pranešimą.

Apskritai funkcija execvp () yra naudinga C programavimo priemonė, skirta vykdyti kitas proceso programas. Tai suteikia lankstumo, paprastumo ir klaidų valdymo galimybių, todėl tai yra esminė funkcija Unix kūrimo aplinkose.

Pereikime per kodą ir žingsnis po žingsnio paaiškinkime jo išvestį.

  1. Programa pradedama įtraukiant reikalingus antraštės failus: standartinėms įvesties/išvesties funkcijoms ir funkcijai execvp().
  2. Funkcijos main() viduje deklaruojamas ir inicijuojamas simbolių rodyklių masyvas argv. Jame pateikiami argumentai, kuriuos reikia perduoti naujam procesui. Šiuo atveju turime du argumentus: „ls“ ir „-l“. Paskutinis masyvo elementas yra NULL, kad būtų nurodyta argumentų sąrašo pabaiga.
  3. Funkcija execvp() iškviečiama naudojant komandą 'ls' ir argv masyvą kaip argumentus. Ši funkcija ieško komandos „ls“ PATH aplinkos kintamajame išvardytuose kataloguose ir pakeičia dabartinį procesą komanda „ls“, jei ji randama.
  4. Jei funkcija execvp() yra sėkminga, kodo vykdymas niekada nepasieks šio taško, nes dabartinis procesas pakeičiamas nauju procesu. Todėl iš pradinės programos išvestis nebus sukurta.
  5. Jei funkcija execvp() nepavyksta, vykdomas šis kodas. Funkcija perror() iškviečiama su argumentu „execvp“, kad būtų išspausdintas klaidos pranešimas. Bus parodytas aprašomasis klaidos pranešimas, nurodantis gedimo priežastį.

Tarkime, kad sistemoje yra komanda „ls“, o programa yra sukompiliuota ir vykdoma. Išvestis būtų panaši į išvestį, kurią gautumėte paleisdami komandą „ls -l“ terminale.

Pavyzdžiui, jei dabartiniame kataloge yra failų ir katalogų, išvestis gali atrodyti taip:

 total 8 -rwxr-xr-x 1 user group 8728 May 17 10:30 program -rw-r--r-- 1 user group 345 May 17 10:29 file.txt drwxr-xr-x 2 user group 4096 May 17 10:29 directory 

Tiksli išvestis priklausys nuo katalogo, kuriame vykdoma programa, turinio. Komanda „ls -l“ pateikia išsamią informaciją apie failus ir katalogus, įskaitant leidimus, nuosavybę, dydį ir modifikavimo laiko žymą.

Jei komanda „ls“ nerasta arba vykdant įvyksta kokia nors klaida, funkcija execvp() suges, o funkcija perror() išspausdins atitinkamą klaidos pranešimą. Pavyzdžiui, jis gali rodyti kažką panašaus:

Parsisiųsti youtube vaizdo įrašą su vlc
 execvp: No such file or directory 

Tai rodo, kad „ls“ komandos nepavyko rasti sistemos PATH kataloguose.

Štai kaip kodas veikia ir kokios išvesties iš jo galite tikėtis.

Funkcija execvp() programoje C turi keletą savybių, konkrečių naudojimo scenarijų, privalumų ir trūkumų. Panagrinėkime juos:

Charakteristikos:

Pakeičia dabartinį procesą: Kai execvp() iškviečiamas sėkmingai, jis pakeičia esamą procesą nauju procesu, nurodytu pateiktoje komandoje.

Ieško vykdomojo failo: Jis ieško nurodyto failo / komandos kataloguose, pateiktuose PATH aplinkos kintamajame, todėl nereikia pateikti viso kelio į vykdomąjį failą.

Naudoja kintamuosius argumentus: Funkcija priima kintamuosius argumentus kaip masyvą, leidžiantį lanksčiai perduoti argumentus naujam procesui.

Sėkmės negrąžina: Jei execvp() yra sėkmingas, kodas po jo iškvietimo nevykdomas, nes dabartinis procesas pakeičiamas.

Naudojimas:

Proceso vykdymas: execvp() dažniausiai naudojamas kitoms programoms ar komandoms vykdyti iš C programos. Tai ypač naudinga, kai norite paleisti išorines programas su konkrečiais argumentais.

Shell įgyvendinimas: Funkcija execvp() dažnai naudojama įgyvendinant apvalkalą, kur reikia vykdyti vartotojo komandas.

Privalumai:

Paprastumas ir patogumas: Funkcija supaprastina programos vykdymą, tvarkydama vykdomojo failo paiešką ir perduodant argumentus naujam procesui.

Java eilutė palyginimui

Lankstus argumentų perdavimas: execvp() leidžia perduoti kintamą argumentų skaičių kaip masyvą, todėl lengviau tinkinti ir koreguoti argumentus, kurie bus perduodami naujam procesui.

Automatinė kelio skyra: Funkcija automatiškai ieško vykdomojo failo PATH kataloguose, todėl nebereikia nurodyti viso kelio, taip suteikiant daugiau lankstumo ir pritaikomumo.

Trūkumai:

Proceso nutraukimas: Kai execvp() iškviečiamas ir sėkmingai veikia, dabartinis procesas pakeičiamas, o kodas po iškvietimo nevykdomas. Tai gali būti trūkumas, jei reikia atlikti svarbų valymo arba po vykdymo kodą.

Negalite kontroliuoti naujo proceso: Kai naujas procesas yra vykdomas, pradinis procesas nekontroliuoja ar nemato jo vykdymo, nebent naudojami tarpprocesiniai ryšio mechanizmai.

Ribotas klaidų tvarkymas: Nors execvp() pateikia klaidų ataskaitas per errno kintamąjį, pati funkcija nepateikia išsamių klaidų pranešimų. Norint tinkamai tvarkyti klaidas, reikalingas papildomas klaidų tvarkymas ir klaidų pranešimų spausdinimas.

Apskritai, execvp () yra galinga ir plačiai naudojama C funkcija, skirta vykdyti kitas programas ar komandas iš programos. Tai supaprastina programos vykdymo procesą, suteikia lankstumo perduodant argumentus ir automatiškai nustato vykdomąjį kelią. Tačiau ji turi apribojimų, susijusių su proceso užbaigimu ir klaidų apdorojimu, į kuriuos reikia atsižvelgti naudojant funkciją.

Išvada

Apibendrinant galima pasakyti, kad C funkcija execvp() yra galingas sistemos iškvietimas, leidžiantis pakeisti esamą procesą nauju procesu, nurodytu pateiktoje komandoje. Tai supaprastina išorinių programų ar komandų vykdymą, tvarko vykdomojo failo paiešką ir perduoda argumentus naujam procesui.

Funkcijai būdinga galimybė ieškoti vykdomųjų failų PATH kataloguose, kintamųjų argumentų, perduodamų kaip masyvas, naudojimas ir tai, kad ji negrįžta po sėkmės. Jis dažniausiai naudojamas proceso vykdymui ir apvalkalų įgyvendinimui.

Execvp() pranašumai yra jos paprastumas, patogumas, lankstus argumentų perdavimas ir automatinė kelio raiška. Tačiau reikia atsižvelgti ir į kai kuriuos trūkumus, pvz., naujo proceso nekontroliavimas, ribotos klaidų apdorojimo galimybės ir esamo proceso nutraukimas sėkmingai jį įvykdžius.

Apskritai funkcija execvp () yra vertingas įrankis, leidžiantis vykdyti kitas programas C programoje. Tai suteikia patogumo, lankstumo ir automatizuotos kelio skyros, todėl ji yra plačiai naudojama Unix operacinėse sistemose. Suprasdami jo ypatybes, naudojimo scenarijus ir privalumus bei trūkumus, galite efektyviai panaudoti execvp() galią savo C programose.