Exec sistēmas izsaukums tiek izmantots, lai izpildītu failu, kas atrodas aktīvajā procesā. Ja exec sauc par iepriekšējo izpildāmo failu, tiek aizstāts un tiek izpildīts jauns fails.
Precīzāk, mēs varam teikt, ka, izmantojot exec sistēmas izsaukumu, procesa vecais fails vai programma tiks aizstāta ar jaunu failu vai programmu. Viss procesa saturs tiek aizstāts ar jaunu programmu.
Lietotāja datu segments, kas veic sistēmas izsaukumu exec (), tiek aizstāts ar datu failu, kura nosaukums ir norādīts argumentā, izsaucot exec ().
Jaunā programma tiek ielādēta tajā pašā procesa telpā. Pašreizējais process ir tikko pārvērsts par jaunu procesu, un tāpēc procesa ID PID netiek mainīts, tas ir tāpēc, ka mēs neveidojam jaunu procesu, mēs tikai aizstājam procesu ar citu exec procesu.
Ja pašlaik notiekošais process satur vairāk nekā vienu pavedienu, visi pavedieni tiks pārtraukti un jaunais procesa attēls tiks ielādēts un pēc tam izpildīts. Nav destruktora funkciju, kas pārtrauc pašreizējā procesa pavedienus.
Procesa PID netiek mainīts, bet dati, kods, kaudze, kaudze utt. procesa tiek mainīti un tiek aizstāti ar tikko ielādētā procesa procesiem. Jaunais process tiek veikts no ieejas punkta.
Exec sistēmas izsaukums ir funkciju kopums, un C programmēšanas valodā šo funkciju standarta nosaukumi ir šādi:
- izpildīt
- izpildīt
- execlp
- izpildīt
- izpildīt
- izpildīt
Šeit jāatzīmē, ka šīm funkcijām ir vienāda bāze izpild kam seko viena vai vairākas vēstules. Tie ir paskaidroti turpmāk:
e: Tas ir rādītāju masīvs, kas norāda uz vides mainīgajiem lielumiem un tiek tieši nodots tikko ielādētajam procesam.
l: l ir komandrindas argumenti, kas funkcijai nosūtīja sarakstu
p: p ir ceļa vides mainīgais, kas palīdz atrast failu, kas nodots kā arguments, kas jāielādē procesā.
v: v ir komandrindas argumentiem. Tie tiek nodoti kā funkciju masīvu rādītāji.
Kāpēc tiek izmantots exec?
exec tiek izmantots, ja lietotājs tajā pašā procesā vēlas palaist jaunu failu vai programmu.
Exec iekšējais darbs
Apsveriet šādus punktus, lai saprastu, kā darbojas exec:
- Pašreizējais procesa attēls tiek pārrakstīts ar jaunu procesa attēlu.
- Jauns procesa attēls ir tas, kuru jūs nodevāt kā argumentu exec
- Pašlaik notiekošais process ir beidzies
- Jaunajam procesa attēlam ir tāds pats procesa ID, tā pati vide un faila deskriptors (jo process netiek aizstāts) procesa attēls tiek aizstāts)
- Tiek ietekmēta CPU stat un virtuālā atmiņa. Pašreizējā procesa attēla virtuālās atmiņas kartēšana tiek aizstāta ar jauna procesa attēla virtuālo atmiņu.
Exec ģimenes funkciju sintakse:
Katras exec funkcijas sintakse ir šāda:
int execl (const char * ceļš, const char * arg,…)int execlp (const char * fails, const char * arg,…)
int execle (const char * ceļš, const char * arg,…, char * const envp [])
int execv (const char * ceļš, const char * argv [])
int execvp (konst char * fails, const char * argv [])
int execvpe (const char * fails, const char * argv [], char * const envp [])
Apraksts:
Šo funkciju atgriešanās veids ir Int. Kad procesa attēls ir veiksmīgi nomainīts, nekas netiek atgriezts izsaukšanas funkcijā, jo process, kas to izsauca, vairs nedarbojas. Bet, ja ir kāda kļūda, -1 tiks atgriezts. Ja ir notikusi kāda kļūda, errno ir iestatīts.
Sintakse:
- ceļš tiek izmantots, lai norādītu izpildāmā faila pilnu ceļa nosaukumu.
- arg ir pieņemtais arguments. Tas faktiski ir faila nosaukums, kas tiks izpildīts procesā. Lielākoties arg un path vērtība ir vienāda.
- const char * arg funkcijās execl (), execlp () un execle () tiek uzskatīti par arg0, arg1, arg2,…, argn. Būtībā tas ir norāžu saraksts uz nulles izbeigtām virknēm. Šeit pirmais arguments norāda uz faila nosaukumu, kas tiks izpildīts, kā aprakstīts 2. punktā.
- envp ir masīvs, kas satur norādes, kas norāda uz vides mainīgajiem.
- failu tiek izmantots, lai norādītu ceļa nosaukumu, kas identificēs jaunā procesa attēla faila ceļu.
- Exec funkcijas izsauc, kas beidzas ar e tiek izmantoti, lai mainītu jaunā procesa attēla vidi. Šīs funkcijas nodod vides iestatījumu sarakstu, izmantojot argumentu envp. Šis arguments ir rakstzīmju masīvs, kas norāda uz nulles izbeigtu virkni un nosaka vides mainīgo.
Lai izmantotu exec saimes funkcijas, C programmā jāiekļauj šāds galvenes fails:
# iekļaut1. piemērs: Exec sistēmas izsaukuma izmantošana C programmā
Apsveriet šādu piemēru, kurā esam izmantojuši exec sistēmas izsaukumu C programmēšanā Linux, Ubuntu: Šeit ir divi c faili.c un sveiki.c:
piemērs.c
KODS:
# iekļaut# iekļaut
# iekļaut
int main (int argc, char * argv [])
printf ("piemēra PID.c =% d \ n ", getpid ());
char * args [] = "Labdien", "C", "Programmēšana", NULL;
execv ("./ labdien ", argumentē);
printf ("Atpakaļ pie piemēra.c ");
atgriešanās 0;
Sveiki.c
KODS:
# iekļaut# iekļaut
# iekļaut
int main (int argc, char * argv [])
printf ("Mēs atrodamies Sveiki.c \ n ");
printf ("sveiki PID.c =% d \ n ", getpid ());
atgriešanās 0;
REZULTĀTS:
PID piemērs.c = 4733Mēs atrodamies Sveiki.c
Sveiki PID.c = 4733
Iepriekš minētajā piemērā mums ir piemērs.c fails un sveiki.c fails. Piemērā .c fails vispirms ir izdrukāts pašreizējā procesa ID (faila piemērs.c darbojas pašreizējā procesā). Tad nākamajā rindā mēs esam izveidojuši rakstzīmju masīvu masīvu. Šī masīva pēdējam elementam jābūt NULL kā beigu punktam.
Tad mēs izmantojām funkciju execv (), kas kā argumentu ņem faila nosaukumu un rakstzīmju masīva masīvu. Šeit jāatzīmē, ka mēs esam izmantojuši ./ ar faila nosaukumu norāda faila ceļu. Tā kā fails atrodas mapē, kur piemērs.c dzīvo, tāpēc nav nepieciešams norādīt pilnu ceļu.
Kad tiek izsaukta funkcija execv (), mūsu procesa attēls tagad tiks aizstāts ar faila piemēru.c nav procesā, bet fails sveiki.c ir procesā. Var redzēt, ka procesa ID ir tas pats, vai sveiki.c ir procesa attēls vai piemērs.c ir procesa attēls, jo process ir vienāds un procesa attēls tiek aizstāts tikai.
Tad mums jāņem vērā vēl viena lieta, kas ir paziņojums printf () pēc tam, kad nav izpildīts execv (). Tas ir tāpēc, ka vadība nekad netiek atgriezta pie vecā procesa attēla, tiklīdz to aizstāj jauns procesa attēls. Vadība atgriežas pie izsaukšanas funkcijas tikai tad, ja procesa attēla nomaiņa ir neveiksmīga. (Šajā gadījumā atgriešanās vērtība ir -1).
Atšķirība starp dakšas () un exec () sistēmas izsaukumiem:
Sistēmas izsaukums fork () tiek izmantots, lai izveidotu precīzu skriešanas procesa kopiju, un izveidotā kopija ir pakārtotais process, un darbības process ir vecāku process. Tā kā exec () sistēmas izsaukums tiek izmantots, lai aizstātu procesa attēlu ar jaunu procesa attēlu. Tādējādi exec () sistēmas izsaukumā nav vecāku un bērnu procesu jēdziena.
Fork () sistēmas izsaukumā vecāku un bērnu procesi tiek izpildīti vienlaicīgi. Bet exec () sistēmas izsaukumā, ja procesa attēla nomaiņa ir veiksmīga, vadīkla neatgriežas tur, kur tika izsaukta funkcija exec, bet tā izpildīs jauno procesu. Vadība tiks pārsūtīta atpakaļ tikai tad, ja būs kāda kļūda.
2. piemērs: Fork () un exec () sistēmas izsaukumu apvienošana
Apsveriet šādu piemēru, kurā vienā un tajā pašā programmā esam izmantojuši gan fork (), gan exec () sistēmas izsaukumus:
piemērs.c
KODS:
# iekļaut# iekļaut
# iekļaut
int main (int argc, char * argv [])
printf ("piemēra PID.c =% d \ n ", getpid ());
pid_t p;
p = dakša ();
ja (p == - 1)
printf ("Zvanot dakšiņu (), radās kļūda");
ja (p == 0)
printf ("Mēs esam bērna procesā \ n");
printf ("Zvans sveiki.c no bērna procesa \ n ");
char * args [] = "Labdien", "C", "Programmēšana", NULL;
execv ("./ labdien ", argumentē);
cits
printf ("Mēs esam vecāku procesā");
atgriešanās 0;
Sveiki.c:
KODS:
# iekļaut# iekļaut
# iekļaut
int main (int argc, char * argv [])
printf ("Mēs atrodamies Sveiki.c \ n ");
printf ("sveiki PID.c =% d \ n ", getpid ());
atgriešanās 0;
REZULTĀTS:
PID piemērs.c = 4790Mēs esam vecāku procesā
Mēs esam bērna procesā
Zvana sveiki.c no bērna procesa
Mēs esam sveiki.c
Sveiki PID.c = 4791
Šajā piemērā mēs izmantojām fork () sistēmas izsaukumu. Kad bērna process ir izveidots, 0 tiks piešķirts p, un pēc tam mēs pāriet uz bērna procesu. Tagad tiks izpildīts paziņojumu bloks ar if (p == 0). Tiek parādīts ziņojums, un mēs esam izmantojuši execv () sistēmas izsaukumu un pašreizējo bērna procesa attēlu, kas ir piemērs.c aizstās ar sveicienu.c. Pirms execv () zvana bērna un vecāku procesi bija vienādi.
Var redzēt, ka piemēra PID.c un sveiki.c tagad ir atšķirīgs. Tas ir tāpēc, ka piemērs.c ir vecāku procesa attēls un sveiki.c ir bērna procesa attēls.