POSIX si riferisce all'interfaccia portatile del sistema operativo, che è uno standard IEEE, sviluppato per favorire la portabilità di diverse applicazioni. POSIX è uno sforzo per costruire una versione standardizzata comune di UNIX attraverso una collaborazione di fornitori. Se fossero efficaci, renderebbe più facile il porting di app tra piattaforme hardware. Hewlett-Packard sta integrando POSIX nel suo sistema operativo MPE/iX con licenza 5d.0 e HP/UXX versione 10.0, rispettivamente (il suo UNIX).
Lo standard POSIX ha molto più di dieci parti, tuttavia, due sono facilmente ottenibili. POSIX.1 descrive le interfacce di programmazione C (i.e., una libreria di chiamate di sistema) per file, procedure e terminali di I/O. La libreria di pacchetti C POSIX per piattaforme POSIX è un framework della libreria C standard. Questo viene stabilito contemporaneamente allo standard ANSI C. Per rendere POSIX conforme allo standard C, sono stati fatti diversi tentativi. POSIX fornisce funzionalità aggiuntive a quelle implementate nello standard C.
Semafori POSIX
Un semaforo è una struttura dati spesso utilizzata per sincronizzare i processi e assistere i thread senza la loro interazione tra loro per operare insieme. L'interfaccia per i semafori è specificata dallo standard POSIX. Non fa parte di Pthreads. Tuttavia, la maggior parte degli UNIX che supportano i Pthread forniscono anche i semafori. Nei framework Unix-like, come Linux, i semafori vengono uniti alle code di messaggi e alla memoria comune sotto i servizi di Interprocess Communication (IPC). I vecchi semafori framework V e i moderni semafori POSIX diventano due tipi di semafori. La chiamata POSIX Semaphore è molto più semplice delle chiamate System V Semaphore. Tuttavia, i semafori System V sono più facili da ottenere, specialmente sulle precedenti piattaforme simili a Unix. È necessario connettere i programmi che utilizzano i semafori POSIX alla libreria Pthread. Daremo un'occhiata ai semafori POSIX in questo articolo.
Perché i semafori POSIX??
C'è un grosso problema intorno ai thread, che è "race condition". È una circostanza in cui due thread cercano di ottenere e alterare la stessa informazione, rendendola così conflittuale. Per evitare una race condition, usiamo i semafori da molto tempo.
I semafori sono disponibili in 2 tipi:
Semaforo binario:
È anche riconosciuto come blocco mutex. Avrebbe solo due valori possibili, 0 e 1. Il valore verrà inizializzato come 1. Viene utilizzato per applicare numerosi processi per risolvere il problema della sezione grave.
Semaforo di conteggio:
La sua dimensione può variare in un dominio senza restrizioni. Viene utilizzato per avere autorità sull'accesso a risorse di numerose istanze.
Il framework Linux POSIX ha il suo repository Semaphore integrato. Per usarlo, dobbiamo:
- Aggiungi semaforo.h
- Accumula il codice connettendoti con -lpthread -lrt.
Quasi tutti i metodi e i moduli POSIX Semaphore sono prototipati o specificati in "Semaphore".h'. Useremo il Semaforo per descrivere un'entità o un oggetto come:
>> sem_t sem_name;Ecco diverse funzioni che utilizzeremmo in POSIX Semaphore.
Sem_init
Per inizializzare un semaforo, devi usare il metodo sem_init. In questa funzione, sem corrisponde a un oggetto semaforo inizializzato. Pshared è un banner o flag che specifica se il semaforo può essere condiviso con una procedura forked() o meno. I semafori condivisi non sono attualmente rinforzati da LinuxThreads. Il valore dell'argomento è il valore iniziale su cui è fissato il semaforo.
>> int sem_init(sem_t *sem, int pshared, unsigned int value);Sem_wait
Useremo il metodo sem-wait per tenere/bloccare un semaforo o farlo aspettare. Se al semaforo è stato fornito un valore negativo, il ciclo di chiamata verrà automaticamente bloccato. Ogni volta che un altro thread chiama sem_post, uno dei processi già intasati si sveglia.
>> int sem_wait(sem_t *sem);Sem_post
Useremo il metodo sem_post per aumentare il valore di un semaforo. Al momento della chiamata, sem_post incrementerà il valore e uno dei processi già intasati o in attesa si riattiverà.
>> int sem_post(sem_t *sem);Sem_getvalue
Se vuoi conoscere il valore di un semaforo, devi utilizzare la seguente funzione sem_getvalue . Otterrà il valore attuale del semaforo e sarà posizionato nella destinazione a punta di valp.
>> Int sem_getvalue(sem_t *sem, int *valp);Sem_destroy
Dovresti usare il metodo sem_destroy se vuoi distruggere il semaforo. Se la fine del semaforo deve procedere, nessun thread sarà in attesa nel semaforo.
>> Int sem_destroy(sem_t *sem);Installa l'utility GCC
Per compilare il codice POSIX Semaphore C, devi avere l'utility gcc installata nel tuo sistema Linux. A questo scopo, apri il tuo terminale di comando e prova il comando seguente.
$ sudo apt-get install gcc
Conferma la tua azione colpendo sì.
Implementazione di POSIX Semaphore con programmazione C in Ubuntu
All'inizio, devi creare un nuovo file con a .cpp su Ubuntu 20.04 sistema. Per questo, devi navigare verso la tua Home Directory e creare un nuovo file vuoto chiamato nuovo.cpp. Puoi anche crearlo usando il comando touch nel tuo terminale di comando.
Puoi vedere che il nuovo.cpp è stato creato nella directory principale.
Dopo la creazione del .cpp, aprilo come editor di testo nel tuo sistema Linux e scrivi il codice seguente in questo file così com'è. Dopodiché, salvalo e chiudilo.
Esegui il programma POSIX Semaphore C in Ubuntu 20.04
Apri il tuo terminale In Ubuntu 20.04 ed esegui il comando gcc sottostante seguito dal nome del file.
$ nome file gcc.c -lpthread -lrt
Ci sono 2 fili formati, uno si forma dopo 2 secondi dall'altro. Dopo aver ricevuto il bullone, il primissimo thread dorme per 4 secondi. Quindi, dopo che è stato chiamato, il secondo thread non si unirebbe direttamente e questo apparirà 4-2=2 secondi dopo che è stato chiamato. Ecco l'output:
Se non avessimo usato il semaforo, secondo il cambio di contesto, il risultato avrebbe potuto essere come osserva:
Conclusione
In questa guida è stata fornita una panoramica dettagliata dell'uso di POSIXSemaphore con la programmazione C in Ubuntu 20. Utilizzando semplicemente la libreria POSIX o Pthread in un determinato codice C, il semaforo POSIX può essere utilizzato abbastanza facilmente per prevenire condizioni di competizione durante la codifica.