Kāpēc izmantot POSIX Spawn?
The posix_spawn () un posix_spawnp () funkcijas tiek izmantotas, lai izveidotu jaunu bērnu procesu. Pēc tam bērna process izpilda failu. Šīs funkcijas POSIX noteica, lai standartizētu jaunu procesu izveidošanas mašīnām, kurām nav dakšu sistēmas zvanu atbalsta. Šīs mašīnas parasti ir mazas, un tām nav iegulto sistēmu lMMU atbalstam.
Abas funkcijas apvieno dakšiņu un exec, ar dažām papildu darbībām, kas izpildīs bērnu. Tie darbojas kā funkcionalitātes apakškopa, kas parasti tiek panākta ar dakšiņu, visiem sistēmas zvaniem un iegultajām sistēmām, kurām šādas funkcionalitātes trūkst.
1. piemērs: posix_spawn ()
Šajā piemērā mēs izmantosim spawn () funkciju, lai izveidotu un izpildītu jaunu bērnu procesu. Tad mēs izskaidrosim visus attiecīgos argumentus, kas izmantoti funkcijā.
Piemēri ir izmantoti šādi argumenti:
Arguments | Apraksts |
---|---|
Izmanto, lai noteiktu visas nārsta darbības. | |
ceļš | Izpildāmā ceļa nosaukums. |
fd_count | Ierakstu skaits ar masīvu fd_map. Ja fd_count ir vienāds ar 0, tad fd_map tiek ignorēts. Šādos gadījumos bērna process pārņem visus failu aprakstus, neņemot vērā modificētos. |
fd_karte | Failu deskriptoru klāsts, ko mantos bērna process. Ja fd_count vērtība nav 0, tad fd_map ir nepieciešams, lai fd_count failu deskriptorus sasniegtu līdz OPEN_MAX augstākajai vērtībai. Tajā ir: · Bērna procesa ievadīšana · Rezultāts · Kļūdu vērtības |
mantot | Strukturālā mantošana parāda, ka lietotāji vēlas, lai viņu bērna process visu pārņemtu no vecākiem. |
argv | Norāde uz konkrētu argumentu vektoru. Argv [0] vērtība nevar būt NULL, un tai jābūt faila nosaukumam, kas tiek ielādēts. Argv vērtība nevar būt vienāda ar NULL. |
envp | Norāda uz rakstzīmju masīvu masīvu. Katrs no šī masīva rādītājiem norāda uz vides mainīgo. Masīva beigu punkts ir NULL rādītājs. |
2. piemērs: tests.c
Šajā piemērā tiek izveidots jauns pakārtotais process, lai palaistu komandu / bin / sh -c. Šī ir vērtība, kas nodota kā pirmais arguments. The pārbaude.c kods ir šāds:
Iepriekš minētajā piemērā mēs izsaucām bibliotēkas, pēc tam saucām nārstot.h galveni. Jūs redzēsiet arī posix_spawn () aicināts izveidot bērna procesu iepriekš minētajā piemērā. The nārstot un nārstot funkcijas tiek izmantotas dakša un izpild funkcijas. Nārsts () ir elastīgs un sniedz lietotājiem daudz viegluma daudzos veidos. Tas ir mazliet atšķirīgs no sistēma () un exec (). Tas atgriezīsies un radīs svaigu bērna procesu. Mūsu piemērā tā ir pid. Iepriekš redzams, ka gaidīšanas funkcija uzgaidīt (), pēc tam sistēma () tiek izmantots. Ievērojiet, ka nārstot () un dakša () izsaukšanas procesi ir vienādi, un ieviešanas metode abām funkcijām ir vairāk vai mazāk vienāda.
Tagad mēs izpildīsim piemēru, izmantojot a gcc sastādītājs. Varat arī izmantot jebkuru citu izvēlēto kompilatoru:
$ sudo gcc tests.c -lrt
Pēc tam palaidiet šo:
$ ./ a.ārā
Iepriekš minētās komandas izeja izskatīsies šādi:
Bērns pid tiks izveidots, kā redzat iepriekš minētajā izvadē.
Bibliotēka
Libc: Izmantojiet -lc, lai saistītu gcc sastādītājs. Ievērojiet, ka šī bibliotēka tiek automātiski iekļauta.
Nārsts ()
The nārstot () funkcijas pamatā ir POSIX 1003.1. standarta projekts izmantots kā posix_spawn (). C bibliotēkā ietilpst nārsta * () funkcijas. Šeit mēs uzskaitīsim dažus sufiksus kopā ar to aprakstiem:
e: izmanto kā masīvu vides mainīgajiem.
l: izmanto kā NULL izbeigtu programmas iekšienē izmantoto argumentu sarakstu.
p: izmanto, lai noteiktu relatīvo ceļu. Ja ceļa vērtība nav slīpsvītra, tad sistēma izmanto un meklē PATH vides mainīgo jebkurai līdzīgai programmai.
v: darbojas kā argumentu vektors programmas iekšienē.
Failu deskriptoru kartēšana
In nārstot (), mēs praktizējam fd_count un fd_karte argumenti, lai izsauktu failu aprakstus. Tajā norādīts, kuru bērnu mantot.
Numurs, kas tiek izmantots kā faila deskriptors bērna procesam, ir atkarīgs no tā atrašanās vietas fd_karte. Šeit mēs apsvērsim vecāku piemēru ar failu aprakstiem, kuru vērtība ir 1, 3 un 5, tad kartēšana būs aptuveni šāda:
>> int fd_map = 1, 3, 5;Bērnam | Vecākam |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Ņemiet vērā, ka, ja izmantojat nepārprotamu fd_karte lai šie failu deskriptori būtu saskaņoti ar bērnu un vecākiem, jums ir jāaplāno SPWAN_FDCLOSE funkcija turpināt.
Mantojuma karogi
Spawn lietotājiem mantojuma gadījumā ir jāizsauc kāds no šiem karodziņiem. Daži nārsta karogu piemēri un to apraksti ir sniegti zemāk:
Karogs | Apraksts |
---|---|
SPAWN_ALIGN_DEFAULT | Šis karodziņš tiek izmantots, lai iestatītu izlīdzināšanas iestatījumu noklusējuma iestatījumus. |
SPAWN_ALIGN_FAULT | Šis karodziņš tiek izmantots kļūdainai datu atsauču pielīdzināšanai. |
SPAWN_ALIGN_NOFAULT | Šis karodziņš tiek izmantots, lai novērstu kļūdas novirzi. |
SPAWN_DEBUG | Šis karodziņš tiek izmantots kodola atkļūdošanai. |
SPAWN_EXEC | SPĀNIJA darbojas kā exec * (), izmantojot šo karodziņu. |
SPAWN_EXPLICIT_CPU | Šis karodziņš tiek izmantots, lai iestatītu palaišanas masku un mantotu mask = run mask biedru. |
SPAWN_EXPLICIT_SCHED | Šis karodziņš tiek izmantots, lai iestatītu plānošanas politiku. |
The <nārstot.h> definē šo masku SPAWN_ALIGN_MASK izmanto, lai izlīdzinātu iepriekš uzskaitītos karodziņus.
pid_t pgroup | Bērna procesa grupa, ja karoga dalībniekā norādāt SPAWN_SETGROUP. |
int runmasks | Bērna runmasks pārņem maskas, par kurām ir panākta vienošanās, pamatojoties uz šī dalībnieka vērtību. |
sigset_t sigmask | Signāla maska bērna procesam, ko izmanto, lai norādītu karoga dalībnieku statusu. |
sigset_t sigdefault | Noklusēto signālu bērnu procesu kopa. |
Kļūdas
The posix_spawn () un posix_spawnp () Dažos gadījumos funkcijas var arī neizdoties, piemēram:
EINVAL: Tas ir gadījums, kad vērtību identificē file_actions vai attrp nav pareizs un adekvāts.
Kad pamata dakšas (2), dakšas (2) vai klona (2) zvans neizdodas, nārstot () Funkcijas atgriezīs kļūdas numuru.
ENOSYS: Tas notiek gadījumā, ja funkcija un tās atbalsts sistēmā nav iekļauts vai nodrošināts.
Secinājums
Šī apmācība aptvēra pamata sniegtās funkcijas POSIX_spawn () un funkcijas, ko tā izmanto, lai izpildītu un veiktu savas funkcijas. Mēs arī aplūkojām karodziņus un kļūdas, kuras parasti lieto Nārsts.