A POSIX az operációs rendszer hordozható interfészére utal, amely IEEE szabvány, amelyet a különböző alkalmazások hordozhatóságának elősegítésére fejlesztettek ki. A POSIX arra törekszik, hogy a gyártók együttműködésével a UNIX szabványosított verzióját felépítse. Ez megkönnyítené az alkalmazások portálozását a hardverplatformok között, ha azok hatékonyak. A Hewlett-Packard integrálja a POSIX-ot licencelt MPE / iX OS 5. verziójába.0 és a HP / UXX 10. verziója.0, ill. (UNIX).
A POSIX szabványnak jóval több mint tíz része van, azonban kettő könnyen beszerezhető. POSIX.Az 1. ábra C programozási interfészeket ír le (azaz.e., egy rendszerhívási könyvtár) fájlok, eljárások és I / O terminálok számára. A C POSIX csomagkönyvtár a POSIX platformok számára a C szabványos könyvtár kerete. Ez a szabványos ANSI C-vel egy időben jön létre. Ahhoz, hogy a POSIX megfeleljen a C szabványnak, több kísérletet tettek. A POSIX további szolgáltatásokat kínál a C szabványban megvalósítottak mellett.
POSIX szemaforok
A szemafor egy olyan adatstruktúra, amelyet gyakran használnak a folyamatok szinkronizálására és a szálak segítésére anélkül, hogy azok kölcsönhatásban lennének egymással. A szemaforok interfészét a POSIX szabvány határozza meg. Nem része a Pthreads-nek. A legtöbb PIXreadot támogató UNIX azonban még szemaforokat is tartalmaz. A Unix-szerű keretrendszerekben, mint a Linux, a szemaforokat egyesítik az üzenetsorokkal és a közös memóriával az Interprocess Communication (IPC) szolgáltatások alatt. A régebbi V keretrendszeri szemaforok és a modern POSIX szemaforok kétféle szemaforává válnak. A POSIX szemafor hívása sokkal könnyebb, mint az V. rendszer szemafor hívása. Bár a System V szemaforjait könnyebb megszerezni, különösen a korábbi Unix-szerű platformokon. Szükség van a POSIX szemaforákat használó programok és a Pthread könyvtár összekapcsolására. Ebben a cikkben megnézzük a POSIX szemaforokat.
Miért POSIX szemaforok?
Nagy probléma van a szálak körül, ami „versenyfeltétel”. Olyan körülmény, amelyben két szál ugyanazon információ megszerzésére és megváltoztatására törekszik, ezáltal ellentmondásossá téve azt. A versenyfeltételek elkerülése érdekében nagyon régóta használunk szemaforokat.
A szemaforok kétféle változatban kaphatók:
Bináris szemafor:
Mutex zárként is felismerik. Csak két lehetséges értéke lenne: 0 és 1. Az érték inicializálása 1 lesz. Számos folyamat végrehajtására használják a komoly szakaszprobléma megoldására.
Szemafor számolása:
Mérete korlátlan tartományonként változhat. Számos példányú erőforrásokhoz való hozzáférés felett felhatalmazással rendelkezik.
A Linux POSIX keretrendszer integrált szemafor tárházával rendelkezik. A használatához:
- Adjon hozzá szemaforot.h
- Halmozd fel a kódot a -lpthread -lrt programmal való összekapcsolással.
Szinte az összes POSIX-szemaformódszer és -forma prototípusa vagy meghatározása a 'Szemafor.h '. A szemaforát egy entitás vagy objektum leírására használjuk:
>> sem_t sem_név;Itt vannak olyan különböző funkciók, amelyeket a POSIX szemaforban használnánk.
Sem_init
A szemafor inicializálásához a sem_init metódust kell használnia. Ebben a függvényben a sem megfelel egy inicializált szemafor objektumnak. A Pshared egy banner vagy flag, amely meghatározza, hogy a szemafor megosztható-e egy forked () eljárással, vagy sem. A megosztott szemaforokat a LinuxThreads jelenleg nem támogatja. Az argumentum értéke az a kiinduló érték, amelynél a szemafor rögzül.
>> int sem_init (sem_t * sem, int pshared, előjel nélküli int érték);Sem_wait
A sem-wait módszert fogjuk használni egy szemafor megtartására / lezárására vagy várakoztatására. Ha a szemafor negatív értéket kapott, akkor a hívásciklus automatikusan blokkolásra kerül. Amikor bármely más szál meghívja a sem_postot, az egyik már eltömődött folyamat felébred.
>> int sem_wait (sem_t * sem);Sem_post
A sem_post metódust fogjuk használni a szemafor értékének növeléséhez. Híváskor a sem_post növeli az értéket, és a már eldugult vagy várakozó folyamatok egyike felébred.
>> int sem_post (sem_t * sem);Sem_getvalue
Ha tudni szeretne egy szemafor értékéről, akkor az alábbi sem_getvalue függvényt kell használnia. Megkapja a szemafor jelenlegi értékét, és a valp-hegyes célpontba kerül.
>> Int sem_getvalue (sem_t * sem, int * valp);Sem_destroy
A sem_destroy metódust kell használnia, ha el akarja semmisíteni a szemaforot. Ha a szemafor bukása folytatódik, akkor a szemaforban egyetlen szál sem fog várakozni.
>> Int sem_destroy (sem_t * sem);Telepítse a GCC segédprogramot
A POSIX Semaphore C kód összeállításához telepítenie kell a gcc segédprogramot a Linux rendszerébe. Erre a célra nyissa meg a parancsterminált, és próbálkozzon az alábbi paranccsal.
$ sudo apt-get install gcc
Ütéssel erősítse meg cselekedetét Y.
POSIX szemafor megvalósítása C programozással az Ubuntuban
A legelején létre kell hoznia egy új fájlt a-val .cpp kiterjesztés az Ubuntu 20-on.04 rendszer. Ehhez navigálnia kell a saját könyvtárába, és létre kell hoznia egy új, üres nevű fájlt.cpp. Létrehozhatja a parancssori terminál érintőképernyős parancsával is.
Láthatja, hogy az új.A cpp fájl létrejött a saját könyvtárban.
A. Létrehozása után .cpp fájlt, nyissa meg szövegszerkesztőként a Linux rendszerében, és írja be az alábbi kódot ebbe a fájlba úgy, ahogy van. Ezt követően mentse el és zárja be.
Futtassa a POSIX Semaphore C programot az Ubuntu 20-ban.04
Nyissa meg a terminált az Ubuntu 20-ban.04, és hajtsa végre az alábbi gcc parancsot, amelyet a fájlnév követ.
$ gcc fájlnév.c -lpthread -lrt
2 szál van kialakítva, az egyik 2 másodperc múlva jön létre. Miután megkapta a csavart, a legelső menet 4 másodpercig alszik. Tehát, miután meghívták, a második szál nem csatlakozik közvetlenül, és ez 4-2 = 2 másodperccel megjelenik a hívás után. Itt van a kimenet:
Ha nem használtuk volna a szemaforát, a kontextusváltás szerint az eredmény a megfigyelések szerint alakulhatott volna:
Következtetés
Ebben az útmutatóban részletesen áttekintették a POSIXSemaphore és C programozás Ubuntu 20 használatát. A POSIX vagy Pthread könyvtár pusztán bizonyos C-kódok használatával a POSIX szemafor könnyen használható a versenyfeltételek megelőzésére a kódolás során.