Zakaj uporabljati POSIX Spawn?
The posix_spawn () in posix_spawnp () funkcije se uporabljata za ustvarjanje novega podrejenega procesa. Nadrejeni postopek nato izvrši datoteko. Te funkcije je POSIX določil za standardizacijo metode ustvarjanja novih procesov za stroje, ki nimajo podpore za sistemske klice z vilicami. Ti stroji so običajno majhni in nimajo vgrajenih sistemov za podporo lMMU.
Funkciji kombinirata fork in exec z nekaj dodatnimi koraki, ki bodo izvedli otroka. Delujejo kot podskupina funkcionalnosti, ki se običajno dosežejo z vilicami, za vse sistemske klice in vdelane sisteme, ki nimajo takšne funkcionalnosti.
Primer 1: posix_spawn ()
V tem primeru bomo uporabili funkcijo spawn () za ustvarjanje in izvajanje novega podrejenega procesa. Nato bomo razložili vse ustrezne argumente, uporabljene v funkciji.
Argumenti, uporabljeni v primeru, so naslednji:
Prepir | Opis |
---|---|
Uporablja se za definiranje vseh operacij drstitve. | |
pot | Ime poti, ki jo je treba izvesti. |
fd_count | Število vnosov z matriko fd_map. Če je fd_count enak 0, je fd_map prezrt. V takih primerih podrejeni proces podeduje vse deskriptorje datotek, pri čemer ne upošteva tistih, ki so bili spremenjeni. |
fd_map | Niz deskriptorjev datotek, ki jih bo podedoval podrejeni postopek. Če vrednost fd_count tukaj ni 0, potem je fd_map potreben, da pripelje opisnike datotek fd_count do najvišje vrednosti OPEN_MAX. Ima: · Otrok vnese proces · Rezultat · Vrednosti napak |
podedovati | Dedovanje struktur kaže, da uporabniki želijo, da njihov podrejeni proces podeduje vse od starša. |
argv | Kazalec na določen vektor argumentov. Vrednost argv [0] ne sme biti NULL in mora biti ime datoteke, ki se nalaga. Vrednost argv ne more biti enaka NULL. |
envp | Kaže na vrsto kazalcev na znake. Vsak od kazalcev v tej matriki kaže na spremenljivko okolja. Končna točka polja je kazalec NULL. |
Primer 2: test.c
V naslednjem primeru je ustvarjen nov podrejeni postopek za zagon ukaza / bin / sh -c. To je vrednost, podana kot prvi argument. The preskus.c koda je naslednja:
V zgornjem primeru smo poklicali knjižnice, nato pa drsti.h glava. Videli boste tudi posix_spawn () poklican, da v zgornjem primeru ustvari podrejeni postopek. The drsti in drstenjep funkcije se uporabljajo namesto vilice in izvrš funkcije. Drstenje () ima fleksibilnost in uporabnikom v mnogih pogledih zagotavlja veliko lahkoto. Je nekoliko drugačen od sistem () in exec (). Vrnil se bo in ustvaril svež otroški postopek. V našem primeru je pid. Zgoraj lahko vidite, da deluje funkcija čakanja waitpid (), potem sistem () se uporablja. Upoštevajte, da drsti () in vilice () klicni procesi so enaki, način izvedbe pa je bolj ali manj enak za obe funkciji.
Zdaj bomo primer izvedli z uporabo gcc prevajalnik. Uporabite lahko tudi kateri koli drug prevajalnik po vaši izbiri:
$ sudo gcc test.c -lrt
Nato zaženite naslednje:
$ ./ a.ven
Izhod zgornjega ukaza bo videti tako:
Otrok pid bo ustvarjen, kot lahko vidite v zgornjem izhodu.
Knjižnica
Libc: Za povezavo uporabite -l c gcc prevajalnik. Tukaj upoštevajte, da je ta knjižnica vključena samodejno.
Drstenje ()
The drsti () funkcija temelji na POSIX 1003.1d osnutek standarda, uporabljen kot posix_spawn (). Knjižnica C vključuje funkcije spawn * (). Tu bomo našteli nekaj končnic, skupaj z njihovimi opisi:
e: uporablja se kot polje za spremenljivke okolja.
l: uporabljen kot NULL-zaključen seznam argumentov, uporabljenih znotraj programa.
p: se uporablja za definiranje relativne poti. Če pot nima poševnice v vrednosti, potem sistem uporabi in poišče spremenljivko okolja PATH za kateri koli podoben program.
v: deluje kot vektor argumentov znotraj programa.
Preslikava deskriptorjev datotek
V drsti (), vadimo fd_count in fd_map argumenti za klic deskriptorjev datotek. Določa, katerega otroka naj podeduje.
Številka, ki se uporablja kot deskriptor datoteke za podrejeni postopek, je odvisna od njegove lokacije znotraj fd_map. Tu bomo obravnavali primer nadrejenega z deskriptorji datotek z vrednostjo 1, 3 in 5, nato pa bo preslikava približno takšna:
>> int fd_map = 1, 3, 5;Za otroka | Za starša |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Upoštevajte, da če uporabljate eksplicitno fd_map Če želite te deskriptorje datotek povezati z otrokom in staršem, morate preslikati SPWAN_FDCLOSE funkcijo za nadaljevanje.
Zastave dedovanja
V Spawnu morajo uporabniki v primeru dedovanja poklicati katero koli od naslednjih zastavic. Nekaj primerov zastav Spawn in njihovi opisi so navedeni spodaj:
Zastava | Opis |
---|---|
SPAWN_ALIGN_DEFAULT | Ta zastava se uporablja za nastavitev privzetih nastavitev nastavitve za poravnavo. |
SPAWN_ALIGN_FAULT | Ta zastava se uporablja za napačno poravnavo referenc podatkov. |
SPAWN_ALIGN_NOFAULT | Ta zastava se uporablja za odpravo neusklajenosti napake. |
SPAWN_DEBUG | Ta zastava se uporablja za razhroščevanje jedra. |
SPAWN_EXEC | SPAWN deluje kot exec * () z uporabo te zastave. |
SPAWN_EXPLICIT_CPU | Ta zastava se uporablja za nastavitev maske za zagon in podedovanje člana mask = run mask. |
SPAWN_EXPLICIT_SCHED | Ta zastava se uporablja za nastavitev pravilnika o načrtovanju. |
The <drsti.h> definira to masko SPAWN_ALIGN_MASK uporablja za poravnavo zgoraj naštetih zastavic.
pid_t pgroup | Podrejena skupina procesov, če v članu zastave podate SPAWN_SETGROUP. |
int runmask | Zagon maske podrejenega procesa za podedovanje mask, dogovorjenih glede na vrednost tega člana. |
sigset_t sigmask | Signalna maska za podrejeni postopek, ki se uporablja za določanje statusa članov zastave. |
sigset_t sigdefault | Nabor podrejenih procesov privzetih signalov. |
Napake
The posix_spawn () in posix_spawnp () funkcije lahko v nekaterih primerih tudi odpovejo, na primer naslednje:
EINVAL: To je primer, ko vrednost, ki jo je določil file_actions ali attrp ni pravilna in ustrezna.
Ko spodnji klic vilic (2), vilic (2) ali klona (2) ne uspe, se drsti () funkcije vrnejo številko napake.
ENOSYS: To velja, če funkcija in njena podpora ni vključena ali zagotovljena v sistemu.
Zaključek
Ta vadnica je zajela osnovne funkcionalnosti, ki jih ponuja POSIX_spawn () in funkcije, ki jih uporablja za izvajanje in izvajanje svojih funkcij. Pokrili smo tudi zastave in napake, ki jih Spawn pogosto uporablja.