Kodėl verta naudoti „POSIX Spawn“?
The posix_spawn () ir posix_spawnp () funkcijos yra naudojamos kuriant naują vaiko procesą. Tada vaiko procesas vykdo failą. Šias funkcijas POSIX nurodė standartizuoti naujų procesų kūrimo metodą mašinoms, neturinčioms šakių sistemos skambučių palaikymo. Šios mašinos paprastai yra mažos ir jose trūksta įterptųjų sistemų, skirtų palaikyti lMMU.
Šios dvi funkcijos sujungia šakę ir „exec“ su keliais papildomais veiksmais, kurie atliks vaiką. Jie veikia kaip funkcijų pogrupis, paprastai pasiekiamas šakute, visiems sistemos skambučiams ir įterptosioms sistemoms, kurioms trūksta tokio funkcionalumo.
1 pavyzdys: posix_spawn ()
Šiame pavyzdyje naudosime spawn () funkciją, kad sukurtume ir įvykdytume naują vaiko procesą. Tada mes paaiškinsime visus svarbius argumentus, naudojamus funkcijoje.
Pavyzdyje naudojami šie argumentai:
Argumentas | apibūdinimas |
---|---|
Naudojamas apibrėžti visas ikrus atliekančias operacijas. | |
kelias | Kelio, kurį reikia vykdyti, pavadinimas. |
fd_count | Įrašų su masyvu fd_map skaičius. Jei fd_count yra lygus 0, fd_map nepaisoma. Tokiais atvejais vaiko procesas paveldi visus failų aprašus, nepaisydamas modifikuotų. |
fd_map | Failų aprašų masyvas, kurį paveldės vaiko procesas. Jei fd_count reikšmė nėra 0, tada fd_map reikalingas, kad failo aprašai fd_count pasiektų didžiausią OPEN_MAX vertę. Tai turi: · Vaiko proceso indėlis · Rezultatas · Klaidos vertės |
paveldėti | Struktūrinis paveldėjimas rodo, kad vartotojai nori, kad jų vaikas procesą paveldėtų iš tėvų. |
argv | Konkretaus argumento vektoriaus žymeklis. Argv [0] reikšmė negali būti NULL ir turi būti įkeliamas failo vardas. Argv reikšmė negali būti lygi NULL. |
envp | Nurodo simbolių masyvo masyvą. Kiekvienas šio masyvo žymeklis nurodo aplinkos kintamąjį. Masyvo pabaigos taškas yra NULL rodyklė. |
2 pavyzdys: bandymas.c
Šiame pavyzdyje yra sukurtas naujas antrinis procesas, pagal kurį vykdoma komanda / bin / sh -c. Tai vertė, perduota kaip pirmasis argumentas. The testas.c kodas yra toks:
Ankstesniame pavyzdyje mes paskambinome į bibliotekas, tada paskambinome į neršti.h antraštė. Taip pat pamatysite posix_spawn () raginamas sukurti vaiko procesą aukščiau pateiktame pavyzdyje. The neršti ir neršti funkcijos yra naudojamos vietoje šakutė ir egzek funkcijos. Nerštas () turi lankstumą ir daugeliu atžvilgių suteikia vartotojams daug lengvumo. Tai šiek tiek skiriasi nuo sistema () ir exec (). Tai sugrįš ir sukurs naują vaiko procesą. Mūsų pavyzdyje taip yra pid. Aukščiau galite pamatyti laukimo funkciją waitpid (), tada sistema () yra naudojamas. Atkreipkite dėmesį, kad neršti () ir šakutė () skambinimo procesai yra vienodi, o abiejų funkcijų įgyvendinimo būdas yra daugmaž vienodas.
Dabar vykdysime pavyzdį naudodami a gcc sudarytojas. Taip pat galite naudoti bet kurį kitą pasirinktą kompiliatorių:
$ sudo gcc testas.c -lrt
Tada paleiskite šiuos veiksmus:
$ ./ a.išėjo
Minėtos komandos išvestis atrodys taip:
Vaikas pid bus sukurta, kaip matote aukščiau pateiktame išvestyje.
Biblioteka
Libc: Norėdami susieti, naudokite -lc gcc sudarytojas. Čia atkreipkite dėmesį, kad ši biblioteka įtraukiama automatiškai.
Nerštas ()
The neršti () funkcija pagrįsta POSIX 1003.1-asis standarto projektas naudojamas kaip posix_spawn (). C bibliotekoje yra neršto * () funkcijos. Čia pateiksime keletą priesagų ir jų aprašymus:
e: naudojamas kaip aplinkos kintamųjų masyvas.
l: naudojamas kaip NULL baigtas programos viduje naudojamų argumentų sąrašas.
p: naudojamas apibrėžti santykinį kelią. Jei kelio reikšmė nėra pasvirojo brėžinio, sistema naudoja ir ieško PATH aplinkos kintamojo bet kuriai panašiai programai.
v: veikia kaip argumentų vektorius programos viduje.
Failų aprašų susiejimas
Į neršti (), mes praktikuojame fd_count ir fd_map argumentai iškviesti bylos aprašus. Jame nurodoma, kurį vaiką paveldėti.
Skaičius, naudojamas kaip failo aprašas vaiko procesui, priklauso nuo jo vietos fd_map. Čia apsvarstysime tėvų pavyzdį su failų aprašais, kurių vertė yra 1, 3 ir 5, tada susiejimas bus maždaug toks:
>> int fd_map = 1, 3, 5;Vaikui | Tėvui |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Atminkite, kad jei naudojate aiškųjį fd_map Norėdami suderinti šiuos failų aprašus su vaiku ir tėvais, turite susieti SPWAN_FDCLOSE funkcija tęsti.
Paveldėjimo vėliavos
„Spawn“ vartotojai paveldėjimo atveju turi iškviesti bet kurią iš šių vėliavų. Keletas „Spawn“ vėliavų pavyzdžių ir jų aprašymai pateikti žemiau:
Vėliava | apibūdinimas |
---|---|
SPAWN_ALIGN_DEFAULT | Ši žyma naudojama norint nustatyti numatytuosius derinimo nustatymus. |
SPAWN_ALIGN_FAULT | Ši žyma naudojama neteisingam duomenų nuorodų suderinimui. |
SPAWN_ALIGN_NOFAULT | Ši žyma naudojama gedimo nesutapimui ištaisyti. |
SPAWN_DEBUG | Ši vėliava naudojama derinant branduolį. |
SPAWN_EXEC | SPAWN veikia kaip „exec *“ () naudodamas šią vėliavą. |
SPAWN_EXPLICIT_CPU | Ši žyma naudojama norint nustatyti bėgimo kaukę ir paveldėti kaukės = paleisti kaukės narį. |
SPAWN_EXPLICIT_SCHED | Ši žyma naudojama planavimo politikai nustatyti. |
The <neršti.h> apibrėžia tą kaukę SPAWN_ALIGN_MASK naudojami aukščiau išvardytoms vėliavoms sulyginti.
pid_t pgroup | Vaiko proceso grupė, jei vėliavos naryje nurodote SPAWN_SETGROUP. |
int runmask | Vaiko kaukė paveldi kaukes, dėl kurių susitarta pagal šio nario vertę. |
sigset_t sigmask | Signalo kaukė vaiko procesui, naudojama nurodyti vėliavos narių būseną. |
sigset_t sigdefault | Numatytų signalų vaiko procesų rinkinys. |
Klaidos
The posix_spawn () ir posix_spawnp () funkcijos taip pat gali sugesti kai kuriais atvejais, pavyzdžiui:
EINVAL: Tai yra atvejis, kai vertė, kurią identifikuoja failo_veiksmai arba pritraukti nėra teisinga ir adekvati.
Kai pagrindinio šakės (2), šakės (2) ar klono (2) skambutis nepavyksta, neršti () funkcijos grąžins klaidos numerį.
ENOSYS: Taip yra tuo atveju, jei funkcija ir jos palaikymas neįtraukiami į sistemą arba jos nėra.
Išvada
Šioje pamokoje aptartos pagrindinės funkcijos, kurias teikia POSIX_spawn () ir funkcijas, kurias jis naudoja savo funkcijoms vykdyti ir vykdyti. Mes taip pat aptarėme vėliavas ir klaidas, kurias dažniausiai naudoja „Spawn“.