Miks kasutada POSIX Spawn?
The posix_spawn () ja posix_spawnp () funktsioone kasutatakse mõlemad uue lapseprotsessi loomiseks. Seejärel käivitab lapseprotsess faili. Need funktsioonid määras POSIX, et ühtlustada uute protsesside loomise meetod masinatele, millel pole kahvli süsteemikõne tuge. Need masinad on tavaliselt väikesed ja neil puudub lMMU toe jaoks sisseehitatud süsteem.
Need kaks funktsiooni ühendavad kahvli ja execi koos mõne täiendava sammuga, mis lapse hukatakse. Need toimivad funktsionaalsuste alamhulgana, mis tavaliselt saavutatakse kahvli abil kõigi süsteemikõnede ja manustatud süsteemide jaoks, millel puudub selline funktsionaalsus.
Näide 1: posix_spawn ()
Selles näites kasutame uue lapse protsessi loomiseks ja teostamiseks funktsiooni spawn (). Seejärel selgitame kõiki funktsioonis kasutatud asjakohaseid argumente.
Näites kasutatud argumendid on järgmised:
Argument | Kirjeldus |
---|---|
Kasutatakse kõigi kudemist teostavate toimingute määratlemiseks. | |
tee | Käivitatava tee nimi. |
fd_count | Massiiviga fd_map sisalduvate kirjete arv. Kui fd_count on võrdne 0-ga, ignoreeritakse fd_map-i. Sellistel juhtudel pärib lapseprotsess kõik failikirjeldajad, eirates neid, mida muudeti. |
fd_map | Lapseprotsessi poolt pärandatav failide kirjeldajate massiiv. Kui fd_count väärtus pole 0, on faili fd_count kirjeldajate viimiseks ülemise väärtuseni OPEN_MAX vaja fd_map. Sellel on: · Lapse protsessi sisend · Väljund · Vea väärtused |
pärima | Struktureeritud pärand näitab, et kasutajad soovivad, et nende lapseprotsess päriks kõik vanemalt. |
argv | Konkreetse argumendivektori kursor. Argv [0] väärtus ei saa olla NULL ja see peab olema laaditav failinimi. Argv väärtus ei saa olla võrdne väärtusega NULL. |
envp | Osutab tähemärkide reale. Iga selle massiivi osuti osutab keskkonnamuutujale. Massiivi lõpp-punkt on NULL-osuti. |
Näide 2: test.c
Järgmises näites luuakse uus alamprotsess käsu käivitamiseks / bin / sh -c. See on esimese argumendina edastatud väärtus. The test.c kood on järgmine:
Ülaltoodud näites helistasime raamatukogudele ja seejärel nimele kudema.h päis. Näete ka posix_spawn () ülaltoodud näites kutsutakse üles looma lapseprotsess. The kudema ja kudema funktsioone kasutatakse kahvel ja exec funktsioone. Kudema () on paindlik ja pakub kasutajatele palju võimalusi mitmel viisil. See on pisut erinev süsteem () ja exec (). See naaseb ja loob uue lapse protsessi. Meie näites on see nii pid. Eespool näete, et ootefunktsioon ootama (), siis süsteem () kasutatakse. Pange tähele, et kudema () ja kahvel () helistamisprotsessid on samad ja mõlema funktsiooni puhul on rakendamise meetod enam-vähem sama.
Nüüd täidame näite, kasutades a gcc koostaja. Võite kasutada ka mõnda muud valitud kompilaatorit:
$ sudo gcc test.c -lrt
Järgmisena käivitage järgmine:
$ ./ a.välja
Ülaltoodud käsu väljund näeb välja järgmine:
Laps pid luuakse, nagu näete ülaltoodud väljundist.
Raamatukogu
Libc: Lingi linkimiseks kasutage -lc gcc koostaja. Pange tähele, et see teek kaasatakse automaatselt.
Kudema ()
The kudema () funktsioon põhineb POSIX 1003-l.1. standardi mustandit kasutatakse posix_spawn (). C-teek sisaldab kudemisfunktsiooni * (). Siin loetleme mõned sufiksid koos nende kirjeldustega:
e: kasutatakse keskkonnamuutujate massiivina.
l: kasutatakse NULL-lõpetatud loendina programmis kasutatud argumentidest.
p: kasutatakse suhtelise tee määratlemiseks. Kui tee väärtus ei ole kaldkriipsuga, kasutab süsteem ja otsib keskkonnamuutujat PATH mis tahes sarnase programmi jaoks.
v: toimib programmi sees olevate argumentide vektorina.
Failide kirjeldajate kaardistamine
Sisse kudema (), me harjutame fd_count ja fd_map argumendid failikirjeldajate väljakutsumiseks. See täpsustab, millise lapse pärida.
Lapseprotsessi failikirjeldajana kasutatav number sõltub selle asukohast fd_map. Siinkohal kaalume vanema näidet failikirjeldajatega, mille väärtus on 1, 3 ja 5, siis on kaardistamine umbes selline:
>> int fd_map = 1, 3, 5;Lapse jaoks | Vanemale |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Pange tähele, et kui kasutate selgesõnalist fd_map Nende failikirjeldajate sobitamiseks lapse ja vanemaga peate selle kaardistama SPWAN_FDCLOSE funktsiooni jätkamiseks.
Pärandilipud
Spawnis peavad kasutajad pärimise korral välja kutsuma mõne järgmise lipu. Mõned näited Spawn lippudest ja nende kirjeldustest on toodud allpool:
Lipp | Kirjeldus |
---|---|
SPAWN_ALIGN_DEFAULT | Seda lippu kasutatakse joondamise seadistuse vaikeseadete seadistamiseks. |
SPAWN_ALIGN_FAULT | Seda lippu kasutatakse andmete viidete vea joondamiseks. |
SPAWN_ALIGN_NOFAULT | Seda lippu kasutatakse tõrke vea parandamiseks. |
SPAWN_DEBUG | Seda lippu kasutatakse tuuma silumiseks. |
SPAWN_EXEC | SPAWN toimib seda lippu kasutades nagu exec * (). |
SPAWN_EXPLICIT_CPU | Seda lippu kasutatakse käivitamismaski määramiseks ja maski = jooksu maski liikme pärimiseks. |
SPAWN_EXPLICIT_SCHED | Seda lippu kasutatakse ajastamise poliitika määramiseks. |
The <kudema.h> määratleb selle maski SPAWN_ALIGN_MASK kasutatakse eespool loetletud lippude joondamiseks.
pid_t pgroup | Lapseprotsessi rühm, kui määrate lipuliikmes SPAWN_SETGROUP. |
int runmask | Lapse runmask pärib selle liikme väärtusest lähtuvalt kokku lepitud maskid. |
sigset_t sigmask | Alamprotsessi signaalimask, mida kasutatakse lipuliikmete oleku määramiseks. |
sigset_t sigdefault | Vaikimisi signaalide alamprotsesside komplekt. |
Vead
The posix_spawn () ja posix_spawnp () funktsioonid võivad ka teatud juhtudel ebaõnnestuda, näiteks järgmised:
EINVAL: Seda juhul, kui väärtus, mille tähistab faili toimingud või attrp ei ole õige ja adekvaatne.
Kui aluseks oleva kahvli (2), kahvli (2) või klooni (2) kõne nurjub, siis kudema () funktsioonid tagastavad vea numbri.
ENOSYS: Seda juhul, kui funktsioon ja selle tugi ei kuulu süsteemi ega paku seda.
Järeldus
See õpetus käsitles põhifunktsioonid, mille pakkus POSIX_spawn () ja funktsioonid, mida ta kasutab oma funktsioonide täitmiseks ja täitmiseks. Samuti käsitlesime Spawani tavaliselt kasutatavaid lippe ja vigu.