POSIX refererer til den bærbare grænseflade til operativsystemet, som er en IEEE-standard, udviklet til at hjælpe med bærbarhed af forskellige applikationer. POSIX er et forsøg på at opbygge en fælles standardversion af UNIX gennem et samarbejde mellem leverandører. Det ville gøre det lettere at portere apps blandt hardwareplatforme, hvis de er effektive. Hewlett-Packard integrerer POSIX i sin licenserede MPE / iX OS version 5.0 og HP / UXX version 10.Henholdsvis 0 (dens UNIX).
POSIX-standarden har meget mere end ti dele, men to er let tilgængelige. POSIX.1 beskriver C-programmeringsgrænseflader (i.e., et systemopkaldsbibliotek) til filer, procedurer og I / O-terminaler. C POSIX-pakkebiblioteket til POSIX-platforme er en ramme for C-standardbiblioteket. Dette etableres på samme tid som standard ANSI C. For at gøre POSIX kompatibel med standard C er der gjort flere forsøg. POSIX giver yderligere funktioner til dem, der er implementeret i standard C.
POSIX semaforer
En semafor er en datastruktur, der ofte bruges til at synkronisere processerne og hjælpe tråde uden deres interaktion med hinanden for at fungere sammen. Grænsefladen til semaforer er specificeret af POSIX-standarden. Det er ikke en del af Pthreads. Imidlertid giver de fleste UNIX'er, der understøtter Pthreads, endda semaforer. I Unix-lignende rammer, som Linux, flettes semaforer med meddelelseskøer og fælles hukommelse under Interprocess Communication (IPC) -tjenesterne. De ældre rammer V-semaforer og de moderne POSIX-semaforer bliver to typer semaforer. POSIX Semaphore-opkald er så meget lettere end System V Semaphore-opkald. Selvom System V-semaforer er lettere at få, især på tidligere Unix-lignende platforme. Der er behov for at forbinde programmer ved hjælp af POSIX semaforer til Pthread-biblioteket. Vi kigger på POSIX-semaforerne i denne artikel.
Hvorfor POSIX Semafhores?
Der er et stort problem omkring tråde, som er "race condition". Det er en omstændighed, hvor to tråde søger at få og ændre den samme information og derved gøre den modstridende. For at undgå en race-tilstand har vi brugt semaforer i meget lang tid.
Semaforer fås i to slags:
Binær semafor:
Det anerkendes også som en mutex-lås. Det ville kun have to mulige værdier, 0 og 1. Værdien initialiseres som 1. Det bruges til at håndhæve adskillige processer til at løse det alvorlige sektionsproblem.
Tæller Semaphore:
Dens størrelse kan variere på tværs af et ubegrænset domæne. Det bruges til at have autoritet over adgang til ressourcer med mange instanser.
Linux POSIX-rammen har sit integrerede Semaphore-lager. For at bruge det skal vi:
- Tilføj semafor.h
- Stab koden op ved at oprette forbindelse til -lpthread -lrt.
Næsten alle POSIX Semaphore-metoder og former er prototypet eller specificeret i 'Semaphore.h '. Vi bruger Semaphore til at beskrive en enhed eller et objekt som:
>> sem_t sem_name;Her er forskellige funktioner, vi ville bruge i POSIX Semaphore.
Sem_init
For at initialisere en semafor skal du bruge metoden sem_init. I denne funktion svarer sem til et initialiseret semaforobjekt. Pshared er et banner eller flag, der specificerer, om semaforen kan deles med en forked () -procedure eller ej. Delte semaforer understøttes i øjeblikket ikke af LinuxThreads. Argumentværdien er startværdien, som semaforen er fastgjort til.
>> int sem_init (sem_t * sem, int pshared, usigneret int-værdi);Sem_wait
Vi bruger sem-vent-metoden til at holde / låse en semafor eller få den til at vente. Hvis semaforen er forsynet med en negativ værdi, blokeres opkaldscyklussen automatisk. Når som helst anden tråd kalder sem_post, vågner en af de allerede tilstoppede processer.
>> int sem_wait (sem_t * sem);Sem_post
Vi bruger metoden sem_post til at øge værdien af en semafor. Ved opkald øger sem_post værdien, og en af de allerede tilstoppede eller ventende processer vågner.
>> int sem_post (sem_t * sem);Sem_getvalue
Hvis du vil vide om værdien af en semafor, skal du bruge nedenstående sem_getvalue-funktion. Den opnår den nuværende værdi af semaforen og placeres i den valp-målede destination.
>> Int sem_getvalue (sem_t * sem, int * valp);Sem_destroy
Du bør bruge sem_destroy-metoden, hvis du vil ødelægge semaforen. Hvis semaforens bortgang skal fortsætte, venter der ingen tråd i semaforen.
>> Int sem_destroy (sem_t * sem);Installer GCC Utility
For at kompilere POSIX Semaphore C-koden skal du have gcc-værktøjet installeret i dit Linux-system. Til dette formål skal du åbne din kommandoterminal og prøve nedenstående kommando.
$ sudo apt-get install gcc
Bekræft din handling ved at trykke Y.
Implementering af POSIX Semaphore med C-programmering i Ubuntu
I starten skal du oprette en ny fil med en .cpp-udvidelse på Ubuntu 20.04-systemet. Til dette skal du navigere mod dit hjemmekatalog og oprette en ny tom fil med navnet ny.cpp. Du kan også oprette det ved hjælp af berøringskommandoen i din kommandoterminal.
Du kan se, at den nye.cpp-fil er oprettet i hjemmekataloget.
Efter oprettelsen af .cpp-fil, skal du åbne den som en teksteditor i dit Linux-system og skrive nedenstående kode i denne fil, som den er. Derefter skal du gemme og lukke det.
Udfør POSIX Semaphore C-programmet i Ubuntu 20.04
Åbn din terminal i Ubuntu 20.04 og udfør nedenstående gcc-kommando efterfulgt af filnavnet.
$ gcc filnavn.c -lpthread -lrt
Der dannes 2 tråde, den ene dannes efter 2 sekunder af den anden. Efter modtagelse af bolten sover den allerførste tråd i 4 sekunder. Så efter at den er blevet kaldt, ville den anden tråd ikke slutte sig direkte, og dette vises 4-2 = 2 sekunder efter at det er blevet kaldt. Her er output:
Hvis vi ikke havde brugt semafor ifølge kontekstskift, kunne resultatet have været som observeret:
Konklusion
I denne vejledning er der givet en detaljeret oversigt over brugen af POSIXSemaphore med C-programmering i Ubuntu 20. Ved blot at bruge POSIX- eller Pthread-biblioteket gennem en bestemt C-kode kan POSIX Semaphore ganske let bruges til at forhindre race-betingelser under kodning.