POSIX Semaforer med C -programmering

Posix Semaphores With C Programming



POSIX refererer til operativsystemets bærbare grænseflade, som er en IEEE -standard, der er udviklet til at hjælpe med transport af forskellige applikationer. POSIX er et forsøg på at opbygge en fælles standardiseret version af UNIX gennem et samarbejde med leverandører. Det ville gøre portning af apps blandt hardwareplatforme lettere, hvis de er effektive. Hewlett-Packard integrerer POSIX i henholdsvis sin licenserede MPE/iX OS version 5.0 og HP/UXX version 10.0 (dens UNIX).

POSIX -standarden har meget mere end ti dele, men to er let tilgængelige. POSIX.1 beskriver C -programmeringsgrænseflader (dvs. et systemopkaldsbibliotek) til filer, procedurer og I/O -terminaler. C POSIX -pakkebiblioteket til POSIX -platforme er en ramme for C -standardbiblioteket. Dette er etableret 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 til at fungere sammen. Grænsefladen til semaforer er specificeret af POSIX -standarden. Det er ikke en del af Pthreads. De fleste UNIX'er, der understøtter Pthreads, leverer imidlertid endda semaforer. I Unix-lignende rammer, som Linux, fusioneres semaforer med meddelelseskøer og fælles hukommelse under Interprocess Communication (IPC) -tjenesterne. De ældre rammer V -semaforer og de moderne POSIX -semaforer bliver til to typer semaforer. POSIX Semaphore -opkald er så meget lettere end System V Semaphore -opkald. Selvom System V-semaforer er lettere at opnå, især på tidligere Unix-lignende platforme. Der er behov for at forbinde programmer ved hjælp af POSIX -semaforer til Pthread -biblioteket. Vi tager et kig på POSIX -semaforer i denne artikel.



Hvorfor POSIX Semaforer?

Der er et stort problem omkring tråde, hvilket er race -tilstand. Det er en omstændighed, hvor to tråde søger at indhente og ændre de samme oplysninger og derved gøre dem modstridende. For at undgå løbstilstand har vi brugt semaforer i meget lang tid.



Semaforer findes i 2 slags:





Binær semafor :

Det er også anerkendt som en mutex -lås. Den ville kun have to mulige værdier, 0 og 1. Værdien initialiseres som 1. Den bruges til at håndhæve adskillige processer til at løse det alvorlige sektionsproblem.



Tæller semafor :

Dens størrelse kan variere på tværs af et ubegrænset domæne. Det bruges til at have autoritet over adgang til mange eksemplarer.

Linux POSIX -rammen har sit integrerede Semaphore -lager. For at bruge det skal vi:

  • Tilføj semafor. H
  • Bunker koden op ved at forbinde med -lpthread -lrt.

Næsten alle POSIX Semaphore -metoder og -former er prototypet eller specificeret i ‘Semaphore.h’. Vi vil bruge Semaforen 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 angiver, om semaforen kan deles med en forked () procedure eller ej. Delte semaforer er i øjeblikket ikke afstivet af LinuxThreads. Argumentværdien er startværdien, som semaforen er fikseret til.

>> intsem_init(sem_t*sem, intdelt, usigneret intværdi);

Sem_venter

Vi vil bruge 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 en anden tråd kalder sem_post, vågner en af ​​de allerede tilstoppede processer.

>> intsem_vente(sem_t*sem);

Sem_post

Vi vil bruge sem_post -metoden 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.

>> intsem_post(sem_t*sem);

Sem_getværdi

Hvis du vil vide mere om værdien af ​​en semafor, skal du bruge funktionen sem_getvalue nedenfor. Den vil opnå nutidsværdien af ​​semaforen og placeres i den valpspidsede destination.

>>Int sem_getværdi(sem_t*sem, int *hundehvalp);

Sem_destroy

Du bør bruge metoden sem_destroy, hvis du vil ødelægge semaforen. Hvis afslutningen af ​​semaforen 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 kommandoen herunder.

$sudo apt-get install gcc

Bekræft din handling ved at slå OG .

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 din hjemmebibliotek og oprette en ny tom fil med navnet new.cpp. Du kan også oprette den ved hjælp af berøringskommandoen i din kommandoterminal.

Du kan se, at den nye.cpp -fil er blevet oprettet i hjemmekartoteket.


Efter oprettelsen af ​​.cpp -filen skal du åbne den som en teksteditor i dit Linux -system og skrive nedenstående kode i denne fil, som den er. Derefter gemmes og lukkes 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.

$gccfilnavn.c –lpthread –lrt

Der er dannet 2 tråde, den ene dannes efter 2 sekunder af den anden. Efter at have modtaget 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 denne vises 4-2 = 2 sekunder efter, at den er blevet kaldt. Her er output:

Hvis vi ikke havde brugt semafor, i henhold til kontekstskift, kunne resultatet have været som observerer:

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 i hele en bestemt C -kode kan POSIX Semaphore ganske let bruges til at forhindre løbstilstande under kodning.