Michael Johnson, Erik Trojan - alkalmazások fejlesztése a linux környezetben

14.5.1. Az alprocesszus használata

A legrégebbi univerzalizációs módszer a héj gyermektáplálási folyamatként történő futtatását és a fájlnevek univerzálását irányítja. A standard popen () függvény (lásd a 10. fejezetet) egyszerűsíti ezt a módszert - csak futtassa az ls * .c parancsot a popen () függvénnyel és olvassa el az eredményt. Ez a megközelítés némileg egyszerűbbnek tűnhet, de még mindig hordozható megoldást kínál az univerzalizáció problémájára (ezért használják az olyan alkalmazások, mint a Perl).

Az alábbiakban egy olyan program, amely universalizálja az összes érvet és megjeleníti az összes mérkőzést.

3: #include

4: #include

14.5.2. Belső univerzalizáció

Ha több fájlnév egyetemessé tételére van szükség, akkor több alharmadát futtat a popen () -el, akkor nem lesz hatékony. A (z) glob () függvény lehetővé teszi a fájlnevek univerzálását anélkül, hogy bármilyen alfolyamatot futtatna, hanem a növekvő összetettség és a hordozhatóság csökkentése rovására. Bár a (z) glob () hívást a POSIX.2 szabvány írja le, sok Unix változat még mindig nem támogatja azt.

int glob (const char * minta, int flags,

int (* errfunc) (const char * epath, int eerrno), glob_t * pglob);

Az első paraméter, minta. Olyan sablont definiál, amelynek a fájlneveknek meg kell egyeznie. Lehetővé teszi az univerzalizációs műveletek használatát *. és []. és opcionálisan is

amelyek ugyanúgy kezelhetők, mint a szabványos héjakon. Az utolsó paraméter a struktúrát jelzi, amely az egyetemesítés eredményével telik. Ez a szerkezet a következőképpen van meghatározva.

int gl_pathc; / * útvonalak száma a gl_pathv * /

char ** gl_pathv; / * lista gl_pathc, amely megfelel az útvonalneveknek * /

int gl_offs; / * a gl_pathv a GLOB_DOOFFS * /

a zászlók a következő értékek közül egyek vagy többek, kombinálva egy bitirányú "VAGY" értékkel.

Visszatér, ha hiba történik (ha a függvény nem tudja olvasni a könyvtár könyvtárát, például hozzáférési problémák miatt).

Ha a sablon megegyezik a könyvtár nevével, a / szimbólum hozzá lesz adva a névhez.

Általában a visszatérési útvonal nevek betűrendben vannak rendezve. Ha ez a jelzés be van állítva, akkor nem válogatott.

A telepítés során a pglob-> gl_offs első sorai az útvonalnevek visszaküldött listáján maradnak üresen. Ez lehetővé teszi a glob () használatát számos argumentum igazítása során, amelyet közvetlenül az execv () függvényhez kell átadni.

Ha a fájlnevek egyike sem illeszkedik a mintához, akkor a sablont visszaadják az egyetlen mérkőzésnek (általában nincs visszaadva egyetlen találat). Mindkét esetben a sablon visszaküldik, ha nem tartalmaz univerzálási műveleteket.

A pglob az előző glob () hívás tényleges eredménye. és a hívás bármely eredményét hozzáadják az előző hívás eredményéhez. Ez megkönnyíti a többszörös sablonok univerzálását.

Általában, ha az univerzálási műveletet előzi meg a karakter \. ez egy általános szimbólum. Például a \ * általában egy * nevű fájlnak felel meg. Ha a GLOB_NOESCAPE be van állítva. a szimbólum \ elveszti a speciális jelentését, aa \ * minden olyan fájlnévvel megegyezik, amely \. Ebben az esetben a \. és a \ bcd illeszkedik, de az arachnid nem, mert nem tartalmaz \.

A legtöbb héj nem engedélyezi a fájlnevek univerzálási műveleteit. (futtassa az ls * -et a saját könyvtárában, és hasonlítsa össze az ls-a eredményével.). A glob () függvény általában ilyen módon viselkedik, de a GLOB_PERIOD lehetővé teszi az univerzalizációs műveletek számára a vezető karakterrel való együttműködést. A POSIX-ban a GLOB_PERIOD értéke nincs meghatározva.

Számos héj (a csh példán keresztül) szétválogatja a göndör fogantyúkat alternatívaként; például a sablont kiterjesztjük egy b-re. és a sablon a - ab ac-ig. A GLOB_BRACE lehetővé teszi ezt a viselkedést. A POSIX-ban a GLOB_BRACE értéke nincs meghatározva.

Olyan cselekedetek, mint a GLOB_NOCHECK, kivéve, hogy csak akkor hozza létre a sablont az eredménylistára, ha nem tartalmaz különleges karaktereket. A POSIX-ban a GLOB_NOMAGIC értéke nincs meghatározva.

Tartalmaz egy kiterjesztést tildettel, amelyben

/ Bontsa ki az aktuális felhasználó otthoni könyvtárának elérési útját, és

felhasználó - a felhasználó otthoni felhasználóinak elérési útja előtt. A POSIX-ban a GLOB_TILDE érték nincs meghatározva.

Csak a könyvtárakkal illeszkedik, nem más fájltípusokkal. A POSIX-ban a GLOB_ONLYDIR értéke nincs meghatározva.

A glob () gyakran találkozik olyan könyvtárakkal, amelyekhez a folyamatnak nincs hozzáférése, ami hibákat okoz. Bár a hiba valahogy kezelhető, ha a glob () hibát (GLOB_ERR) ad vissza, akkor az univerzalizációs műveletet nem lehet újraindítani, ha az előző univerzalizációs művelet hibát észlelt. Mivel nehéz egyszerre kiküszöbölni a glob () végrehajtása során felmerülő hibákat. és az univerzalizáció befejezéséhez a glob () lehetővé teszi, hogy átadja a hibát egy speciális függvénynek, amelyet a glob () harmadik paraméter határoz meg.

A funkció prototípusa az alábbiakban látható.

int globerr (const char * elérési út, int globerrno);

A függvény átveszi a hibát okozó elérési utat és az errno értéket. amelyet az egyik opendir () rendszer hív. readdir () vagy stat (). Ha a hiba funkció értéke nullánál nagyobb, akkor a glob () hibaüzenetet kap. Ellenkező esetben az univerzális művelet folytatódik.

Kapcsolódó cikkek