C Programmation

Sémaphores POSIX avec programmation C

Sémaphores POSIX avec programmation C

POSIX fait référence à l'interface portable du système d'exploitation, qui est une norme IEEE, développée pour faciliter la portabilité de différentes applications. POSIX est un effort pour créer une version standardisée commune d'UNIX grâce à une collaboration de fournisseurs. Cela faciliterait le portage des applications entre les plates-formes matérielles si elles sont efficaces. Hewlett-Packard intègre POSIX dans son système d'exploitation MPE/iX sous licence version 5.0 et HP/UXX version 10.0, respectivement (son UNIX).

La norme POSIX comporte bien plus de dix parties, cependant, deux sont facilement accessibles. POSIX.1 décrit les interfaces de programmation C (i.e., une bibliothèque d'appels système) pour les fichiers, les procédures et les terminaux d'E/S. La bibliothèque de packages C POSIX pour les plates-formes POSIX est un framework de la bibliothèque standard C. Ceci est établi en même temps que la norme ANSI C. Pour rendre POSIX conforme à la norme C, plusieurs tentatives ont été faites. POSIX fournit des fonctionnalités supplémentaires à celles implémentées dans la norme C.

Sémaphores POSIX

Un sémaphore est une structure de données souvent utilisée pour synchroniser les processus et assister les threads sans leur interaction les uns avec les autres pour fonctionner ensemble. L'interface pour les sémaphores est spécifiée par la norme POSIX. Cela ne fait pas partie de Pthreads. Cependant, la plupart des UNIX qui prennent en charge les Pthreads fournissent même des sémaphores. Dans les frameworks de type Unix, comme Linux, les sémaphores sont fusionnés avec les files d'attente de messages et la mémoire commune sous les services de communication interprocessus (IPC). Les sémaphores V du framework plus anciens et les sémaphores POSIX modernes deviennent deux types de sémaphores. L'appel de sémaphore POSIX est tellement plus facile que les appels de sémaphore System V. Bien que les sémaphores System V soient plus faciles à obtenir, en particulier sur les anciennes plates-formes de type Unix. Il est nécessaire de connecter des programmes utilisant des sémaphores POSIX à la bibliothèque Pthread. Nous allons jeter un oeil aux sémaphores POSIX dans cet article.

Pourquoi les sémaphores POSIX?

Il y a un gros problème autour des threads, qui est la « race condition ». C'est une circonstance dans laquelle deux threads cherchent à obtenir et à modifier la même information, ce qui la rend conflictuelle. Pour éviter une condition de course, nous utilisons des sémaphores depuis très longtemps.

Les sémaphores sont disponibles en 2 sortes :

Sémaphore binaire:

Il est également reconnu comme un verrou mutex. Il n'aurait que deux valeurs possibles, 0 et 1. La valeur sera initialisée à 1. Il est utilisé pour appliquer de nombreux processus afin de résoudre le grave problème de section.

Compter le sémaphore:

Sa taille peut varier dans un domaine non restreint. Il est utilisé pour avoir autorité sur l'accès à de nombreuses ressources d'instance.

Le framework Linux POSIX a son référentiel Semaphore intégré. Pour l'utiliser, il faut :

Presque toutes les méthodes et formulaires POSIX Sémaphore sont prototypés ou spécifiés dans 'Semaphore.h'. Nous utiliserons le sémaphore pour décrire une entité ou un objet comme :

>> sem_t sem_name;

Voici différentes fonctions que nous utiliserions dans POSIX Semaphore.

Sem_init

Pour initialiser un sémaphore, il faut utiliser la méthode sem_init. Dans cette fonction, sem correspond à un objet sémaphore initialisé. Pshared est une bannière ou un drapeau qui spécifie si le sémaphore peut être partagé avec une procédure forked() ou non. Les sémaphores partagés ne sont pas actuellement bloqués par LinuxThreads. La valeur de l'argument est la valeur de départ à laquelle le sémaphore est fixé à.

>> int sem_init(sem_t *sem, int pshared, valeur int non signée);

Sem_wait

Nous utiliserons la méthode sem-wait pour maintenir/verrouiller un sémaphore ou le faire attendre. Si le sémaphore a reçu une valeur négative, alors le cycle d'appel sera automatiquement bloqué. Chaque fois qu'un autre thread appelle sem_post, l'un des processus déjà obstrués se réveille.

>> int sem_wait(sem_t *sem);

Sem_post

Nous utiliserons la méthode sem_post pour augmenter la valeur d'un sémaphore. Lors de l'appel, sem_post incrémentera la valeur et l'un des processus déjà obstrués ou en attente se réveille.

>> int sem_post(sem_t *sem);

Sem_getvalue

Si vous voulez connaître la valeur d'un sémaphore, vous devez utiliser la fonction ci-dessous sem_getvalue . Il obtiendra la valeur actuelle du sémaphore et sera placé dans la destination pointée par valp.

>> Int sem_getvalue(sem_t *sem, int *valp);

Sem_destroy

Vous devriez utiliser la méthode sem_destroy si vous voulez détruire le sémaphore. Si la disparition du sémaphore doit se poursuivre, aucun thread n'attendra dans le sémaphore.

>> Int sem_destroy(sem_t *sem);

Installer l'utilitaire GCC

Pour compiler le code POSIX Semaphore C, vous devez avoir l'utilitaire gcc installé sur votre système Linux. Pour cela, ouvrez votre terminal de commande et essayez la commande ci-dessous.

$ sudo apt-get install gcc

Affirmez votre action en frappant Oui.

Implémentation de POSIX Sémaphore avec programmation C dans Ubuntu

Au tout début, vous devez créer un nouveau fichier avec un .extension cpp sur Ubuntu 20.04 système. Pour cela, vous devez naviguer vers votre répertoire personnel et créer un nouveau fichier vide nommé nouveau.cpp. Vous pouvez également le créer à l'aide de la commande tactile dans votre terminal de commande.

Vous pouvez voir que le nouveau.cpp a été créé dans le répertoire personnel.


Après la création du .cpp, ouvrez-le en tant qu'éditeur de texte dans votre système Linux et écrivez le code ci-dessous dans ce fichier tel qu'il est. Après cela, enregistrez-le et fermez-le.

Exécuter le programme POSIX Sémaphore C dans Ubuntu 20.04

Ouvrez votre terminal sous Ubuntu 20.04 et exécutez la commande gcc ci-dessous suivie du nom de fichier.

$ nom de fichier gcc.c -lpthread -lrt

Il y a 2 fils formés, l'un est formé après 2 secondes de l'autre. Après avoir reçu le boulon, le tout premier fil dort pendant 4 secondes. Ainsi, après son appel, le deuxième thread ne se joindra pas directement, et cela apparaîtra 4-2 = 2 secondes après son appel. Voici la sortie :

Si nous n'avions pas utilisé de sémaphore, selon le changement de contexte, le résultat aurait pu être le suivant :

Conclusion

Dans ce guide, un aperçu détaillé de l'utilisation de POSIXSemaphore avec la programmation C dans Ubuntu 20 a été donné. En utilisant simplement la bibliothèque POSIX ou Pthread dans certains codes C, le sémaphore POSIX peut être assez facilement utilisé pour empêcher les conditions de concurrence pendant le codage.

Trackpad et pointeur de souris à l'écran AppyMouse pour tablettes Windows
Les utilisateurs de tablettes ratent souvent le pointeur de la souris, surtout lorsqu'ils ont l'habitude d'utiliser les ordinateurs portables. Les sma...
Le bouton central de la souris ne fonctionne pas sous Windows 10
le bouton central de la souris vous aide à faire défiler de longues pages Web et des écrans contenant beaucoup de données. Si cela s'arrête, et bien v...
Comment changer les boutons gauche et droit de la souris sur un PC Windows 10
Il est tout à fait normal que tous les appareils de souris d'ordinateur soient conçus de manière ergonomique pour les droitiers. Mais il existe des so...