Sistēmas zvani

Linux Exec sistēmas izsaukums

Linux Exec sistēmas izsaukums

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:

  1. izpildīt
  2. izpildīt
  3. execlp
  4. izpildīt
  5. izpildīt
  6. 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:

  1. Pašreizējais procesa attēls tiek pārrakstīts ar jaunu procesa attēlu.
  2. Jauns procesa attēls ir tas, kuru jūs nodevāt kā argumentu exec
  3. Pašlaik notiekošais process ir beidzies
  4. 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)
  5. 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:

  1. ceļš tiek izmantots, lai norādītu izpildāmā faila pilnu ceļa nosaukumu.
  1. 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.
  1. 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ā.
  1. envp ir masīvs, kas satur norādes, kas norāda uz vides mainīgajiem.
  1. failu tiek izmantots, lai norādītu ceļa nosaukumu, kas identificēs jaunā procesa attēla faila ceļu.
  1. 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ļaut

1. 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 = 4733
Mē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 = 4790
Mē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.

Vidējā peles poga nedarbojas sistēmā Windows 10
The peles vidējā poga palīdz jums ritināt garas tīmekļa lapas un ekrānus ar lielu datu daudzumu. Ja tas apstājas, jūs galu galā izmantosiet tastatūru,...
Kā nomainīt peles kreiso un labo pogu operētājsistēmā Windows 10
Tas ir diezgan normāli, ka visas datora peles ierīces ir ergonomiski izstrādātas lietotājiem ar labo roku. Bet ir pieejamas peles ierīces, kas ir īpaš...
Atdariniet peles klikšķus, virzot kursoru, izmantojot operētājsistēmā Windows 10 bezklikšķu peli
Peles vai tastatūras lietošana nepareizā pozā, ja to lieto pārmērīgi daudz, var izraisīt daudz veselības problēmu, tostarp spriedzi, karpālā kanāla si...