Dakšu sistēma izsauc Linux

Fork System Call Linux



Dakšu sistēmas izsaukums tiek izmantots, lai izveidotu jaunus procesus. Jaunizveidotais process ir bērna process. Process, kas izsauc dakšiņu un rada jaunu procesu, ir vecāku process. Bērna un vecāku procesi tiek veikti vienlaicīgi.

Bet bērna un vecāku procesi atrodas dažādās atmiņas vietās. Šīm atmiņas vietām ir vienāds saturs, un jebkura darbība, ko veic viens process, neietekmēs otru procesu.







Kad tiek izveidoti bērna procesi; tagad abiem procesiem būs vienāds programmu skaitītājs (PC), tāpēc abi šie procesi norādīs uz vienu un to pašu nākamo norādījumu. Faili, ko atver vecāku process, būs tādi paši kā bērna procesam.



Bērna process ir tieši tāds pats kā tā vecākam, taču procesa ID atšķiras:



  1. Bērna procesa procesa ID ir unikāls procesa ID, kas atšķiras no visu citu esošo procesu ID.
  2. Vecāku procesa ID būs tāds pats kā bērna vecāka procesa ID.

Bērna procesa īpašības

Tālāk ir norādītas dažas īpašības, kas piemīt bērna procesam.





  1. CPU skaitītāji un resursu izmantošana tiek inicializēti, lai atiestatītu uz nulli.
  2. Kad vecāku process tiek pārtraukts, pakārtotie procesi nesaņem nekādu signālu, jo prctl () atribūts PR_SET_PDEATHSIG tiek atiestatīts.
  3. Vītne, ko izmanto, lai izsauktu dakšiņu (), rada bērna procesu. Tātad bērna procesa adrese būs tāda pati kā vecāka adrese.
  4. Vecāku procesa faila deskriptoru pārmanto pakārtotais process. Piemēram, faila nobīde vai karodziņu statuss un I/O atribūti tiks koplietoti starp pakārtoto un vecāku procesu failu aprakstiem. Tātad vecāku klases failu deskriptors atsauksies uz to pašu bērnu klases failu deskriptoru.
  5. Vecāku procesa atvērto ziņojumu rindu deskriptori tiek mantoti pakārtotajā procesā. Piemēram, ja faila deskriptors satur ziņojumu vecāku procesā, tas pats ziņojums būs redzams atbilstošajā pakārtotā procesa faila aprakstā. Tātad mēs varam teikt, ka šo failu aprakstu karoga vērtības ir vienādas.
  6. Līdzīgi atvērtās direktoriju straumes mantos pakārtotie procesi.
  7. Bērnu klases noklusējuma taimera atslābuma vērtība ir tāda pati kā pašreizējā vecāku klases taimera atslābuma vērtība.

Rekvizīti, kas netiek mantoti pēc bērna procesa

Tālāk ir minēti daži rekvizīti, kas netiek mantoti, veicot bērna procesu:

  1. Atmiņas bloķēšana
  2. Bērnu klases gaidāmais signāls ir tukšs.
  3. Apstrādāt saistītās ierakstu slēdzenes (fcntl ())
  4. Asinhronās I/O darbības un I/O saturs.
  5. Paziņojumi par direktoriju maiņu.
  6. Taimeri, piemēram, modinātājs (), iestatīšanas taimeris (), netiek mantoti bērnu klasē.

dakša () C

Dakšā () nav argumentu, un atgriezuma veids dakša () ir vesels skaitlis. Ja tiek izmantota fork (), jums ir jāiekļauj šādi galvenes faili:



#iekļaut
#iekļaut
#iekļaut

Strādājot ar dakšiņu (), var izmantot tipam pid_t procesu ID kā pid_t ir definēts.

Galvenes fails ir vieta, kur tiek definēts fork (), tāpēc jums tas jāiekļauj programmā, lai izmantotu fork ().

Atgriešanās veids ir definēts un fork () izsaukums ir definēts. Tāpēc, lai izmantotu fork () sistēmas zvanu, savā programmā jāiekļauj abi.

Dakšas sintakse ()

Fork () sistēmas zvana sintakse Linux, Ubuntu ir šāda:

pid_t dakša (tukšs);

Sintaksē atgriešanās veids ir pid_t . Kad bērna process ir veiksmīgi izveidots, bērna procesa PID tiek atgriezts vecāku procesā un 0 tiks atgriezts pašam bērna procesam.

Ja ir kāda kļūda, tad -1 tiek atgriezts vecāku procesam un pakārtotais process netiek izveidots.

No arguments are passed to fork(). 

1. piemērs: izsaukšanas dakša ()

Apsveriet šādu piemēru, kurā esam izmantojuši sistēmas dakšas () sistēmas izsaukumu, lai izveidotu jaunu pakārtoto procesu:

KODS:

#iekļaut
#iekļaut
#iekļaut

intgalvenais()
{
dakša();
printf ('Izmantojot fork () sistēmas zvanu n');
atgriezties 0;
}

Izeja:

Izmantojot fork () sistēmas zvanu
Izmantojot fork () sistēmas zvanu

Šajā programmā mēs esam izmantojuši dakšiņu (), tas radīs jaunu bērna procesu. Izveidojot pakārtoto procesu, gan vecāku process, gan pakārtotais process norādīs uz nākamo norādījumu (tas pats programmas skaitītājs). Tādā veidā atlikušie norādījumi vai C priekšraksti tiks izpildīti kopā ar procesa laiku, tas ir, 2nreizes, kur n ir dakšu () sistēmas izsaukumu skaits.

Tātad, ja dakšas () izsaukums tiek izmantots vienu reizi, kā norādīts iepriekš (21= 2) mūsu izlaide būs 2 reizes.

Šeit, izmantojot sistēmas dakšas () sistēmas izsaukumu, iekšējā struktūra izskatīsies šādi:

Apsveriet šādu gadījumu, kad dakša () tiek izmantota 4 reizes:

KODS:

#iekļaut
#iekļaut
#iekļaut

intgalvenais()
{
dakša();
dakša();
dakša();
dakša();
printf ('Izmantojot fork () sistēmas zvanu');
atgriezties 0;
}

Izeja:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

Tagad kopējais izveidoto procesu skaits ir 24= 16, un mūsu izdrukātais paziņojums tiek izpildīts 16 reizes.

2. piemērs. Pārbaude, vai dakša () bija veiksmīga

Nākamajā piemērā mēs esam izmantojuši lēmumu pieņemšanas konstrukciju, lai pārbaudītu vērtību (int), ko atgriež dakša (). Un tiek parādīti atbilstošie ziņojumi:

KODS:

#iekļaut
#iekļaut
#iekļaut

intgalvenais()
{
pid_t lpp;
lpp=dakša();
ja(lpp== -1)
{
printf ('Zvanot uz dakšu (), radās kļūda');
}
ja(lpp==0)
{
printf ('Mēs esam bērna procesā');
}
citādi
{
printf ('Mēs esam vecāku procesā');
}
atgriezties 0;
}

Izeja:

Mēs esam vecāku procesā
Mēs esam bērna procesā

Iepriekš minētajā piemērā mēs esam izmantojuši tipu pid_t, kas saglabās dakšas () atgriešanas vērtību. fork () tiek izsaukts tiešsaistē:

lpp=dakša();

Tātad vesela skaitļa vērtība, ko atgriež dakša (), tiek saglabāta p, un pēc tam p tiek salīdzināts, lai pārbaudītu, vai mūsu dakša () izsaukums bija veiksmīgs.

Ja tiek izmantots dakšas () izsaukums un bērns ir veiksmīgi izveidots, bērna procesa ID tiks atgriezts vecāku procesam un 0 tiks atgriezts pakārtotajam procesam. Bērna procesa ID vecāku procesā nebūs tāds pats kā Bērna procesa ID pašā bērna procesā. Bērna procesā bērna procesa ID būs 0.

Izmantojot šo apmācību, jūs varat redzēt, kā sākt darbu ar dakšu sistēmas zvanu Linux.