Miért érdemes használni a POSIX Spawn-t??
A posix_spawn () és posix_spawnp () a funkciókat egy új gyermekfolyamat létrehozására használják. A gyermek folyamat ezután végrehajt egy fájlt. Ezeket a funkciókat a POSIX határozta meg, hogy szabványosítsa az új folyamatok létrehozásának módszerét olyan gépek számára, amelyek nem rendelkeznek villa rendszer-hívás támogatással. Ezek a gépek általában kicsiek, és nincsenek beágyazott rendszereik az lMMU támogatásához.
A két funkció egyesíti a villát és az execet, néhány további lépéssel, amely végrehajtja a gyermeket. A funkciók részhalmazaként működnek, amelyeket általában villával érnek el minden olyan rendszerhívás és beágyazott rendszer számára, amelyek nem rendelkeznek ilyen funkcióval.
1. példa: posix_spawn ()
Ebben a példában a spawn () függvényt fogjuk használni egy új gyermek folyamat létrehozásához és végrehajtásához. Ezután elmagyarázzuk a függvényben használt összes releváns érvet.
A példában használt érvek a következők:
Érv | Leírás |
---|---|
Az összes spawn műveletet meghatározza. | |
pálya | A végrehajtandó útvonal neve. |
fd_count | Az fd_map tömböt tartalmazó bejegyzések száma. Ha az fd_szám megegyezik 0-val, akkor az fd_térkép figyelmen kívül marad. Ilyen esetekben a gyermekfolyamat örökli az összes fájlleírót, figyelmen kívül hagyva a módosítottakat. |
fd_map | A gyermekfolyamat által öröklődő fájlleírók tömbje. Itt, ha az fd_count értéke nem 0, akkor az fd_map szükséges, hogy az fd_count fájlleírók az OPEN_MAX legfelsőbb értékéhez jussanak. A következőket tartalmazza: · A gyermek folyamat bemenete · A kimenet · A hibaértékek |
örököl | A strukturális öröklés azt mutatja, hogy a felhasználók azt akarják, hogy gyermekük folyamata örököljön mindent a szülőtől. |
argv | A mutató egy adott argumentumvektorra. Az argv [0] érték nem lehet NULL, és a betöltött fájlnévnek kell lennie. Az argv értéke nem lehet egyenlő a NULL értékkel. |
envp | Karaktermutatók tömbjére mutat. A tömb minden mutatója egy környezeti változóra mutat. A tömb célpontja NULL mutató. |
2. példa: teszt.c
A következő példában egy új gyermekfolyamat jön létre a parancs futtatásához / bin / sh -c. Ez az első argumentumként megadott érték. A teszt.c kód a következő:
A fenti példában felhívtuk a könyvtárakat, majd a ívik.h fejléc. Látni fogja a posix_spawn () a fenti példában gyermekfolyamat létrehozására hívják fel. A ívik és spawnp függvényeket használják a Villa és exec funkciókat. Ívik() rugalmas és sok szempontból sok könnyedséget nyújt a felhasználók számára. Kicsit különbözik ettől rendszer() és exec (). Visszatér és létrehozza a friss gyermek folyamatát. Példánkban az pid. Fent látható, hogy a várakozás funkció waitpid (), azután rendszer() használt. Figyeljük meg, hogy a ívik() és Villa() a hívási folyamatok megegyeznek, és a megvalósítás módja mindkét funkció esetében nagyjából azonos.
Most a példával hajtjuk végre a példát gcc fordítóprogram. Használhat bármely más fordítót is, amelyet választott:
$ sudo gcc teszt.c -lrt
Ezután futtassa a következőt:
$ ./ a.ki
A fenti parancs kimenete a következőképpen fog kinézni:
A gyermek pid létrejön, amint az a fenti kimeneten is látható.
Könyvtár
Libc: A -l összekapcsolásához használja a -lc gombot gcc fordítóprogram. Itt vegye figyelembe, hogy ez a könyvtár automatikusan bekerül.
Ívik()
A ívik() funkció a POSIX 1003-on alapul.Az 1. szabványtervezet a posix_spawn (). A C könyvtár tartalmazza a spawn * () függvényeket. Itt felsorolunk néhány utótagot, a leírásukkal együtt:
e: tömbként használják a környezeti változókhoz.
l: a programban használt argumentumok NULL végződésű listájaként használják.
p: relatív útvonal meghatározására szolgál. Ha az elérési út értéke nem perjel, akkor a rendszer bármilyen hasonló programot használ és keres a PATH környezeti változóban.
v: argumentumvektorként működik a programon belül.
Fájlleírók leképezése
Ban ben ívik(), gyakoroljuk a fd_count és fd_map érvek a fájlleírók előhívására. Meghatározza, hogy melyik gyermeket örökölje.
A gyermekfolyamat fájlleírójeként használt szám a fájlon belüli helyétől függ fd_map. Itt megvizsgáljuk az 1, 3 és 5 értékű fájlleírókkal rendelkező szülő példáját, akkor a leképezés valami ilyesmi lesz:
>> int fd_map = 1, 3, 5;A gyermek számára | A szülő számára |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Vegye figyelembe, hogy ha explicitet használ fd_map hogy ezek a fájlleírók megfeleljenek a gyermeknek és a szülőnek, akkor feltérképeznie kell a SPWAN_FDCLOSE funkció folytatásához.
Öröklési zászlók
A Spawn-ban a felhasználóknak öröklés esetén a következő zászlók bármelyikét ki kell hívniuk. Néhány példa a Spawn zászlókra és azok leírása az alábbiakban található:
Zászló | Leírás |
---|---|
SPAWN_ALIGN_DEFAULT | Ez a jelző az igazítás beállításának alapértelmezett beállításainak megadására szolgál. |
SPAWN_ALIGN_FAULT | Ezt a jelzőt használják az adat hivatkozások hibás összehangolásához. |
SPAWN_ALIGN_NOFAULT | Ezt a zászlót használjuk a hiba eltolásának kijavítására. |
SPAWN_DEBUG | Ezt a zászlót használják a kernel hibakeresésére. |
SPAWN_EXEC | A SPAWN úgy működik, mint az exec * (), ezzel a zászlóval. |
SPAWN_EXPLICIT_CPU | Ez a jelző a futásmaszk beállítására és a mask = futásmaszk tag öröklésére szolgál. |
SPAWN_EXPLICIT_SCHED | Ez a jelző az ütemezési házirend beállítására szolgál. |
A <ívik.h> meghatározza azt a maszkot SPAWN_ALIGN_MASK a fent felsorolt zászlók igazítására szolgál.
pid_t pgroup | A gyermekfolyamat-csoport, ha megadja a SPAWN_SETGROUP elemet a zászló tagjában. |
int runmaszk | A gyermek folyamatmaszkja annak a maszknak az öröklése érdekében, amelyben a tag értéke alapján állapodnak meg. |
sigset_t sigmask | A gyermek folyamat jelzőmaszkja, amely a zászlótagok állapotának megadására szolgál. |
sigset_t sigdefault | Az alapértelmezett jelek gyermekfolyamatainak halmaza. |
Hibák
A posix_spawn () és posix_spawnp () a funkciók bizonyos esetekben meghibásodhatnak, például a következők:
EINVAL: Ez az eset áll fenn, amikor a file_actions vagy attrp nem helyes és megfelelő.
Amikor az alapul szolgáló villa (2), villa (2) vagy klón (2) hívás sikertelen, a ívik() A függvények hibaszámot adnak vissza.
ENOSYS: Ez akkor áll fenn, ha a függvény és annak támogatása nem szerepel a rendszerben, vagy nem biztosított.
Következtetés
Ez az oktatóanyag a POSIX_spawn () valamint a funkcióinak végrehajtására és végrehajtására használt funkciókat. Kitértünk a Spawn által gyakran használt zászlókra és hibákra is.