[LINUX] Méthode de contrôle exclusive multi-processus en langage C

Aperçu

Mémo lorsqu'il est exclusif en multi-processus lorsque le fichier d'exécution est différent en langage C

code

GitHub

Flux de processus

  1. Créez une clé de mémoire partagée
  2. Créer une mémoire partagée
  3. Créez un objet mutex sur la mémoire partagée
  4. Verrouiller / déverrouiller avec mutex sur la mémoire partagée

1. Créez une clé de mémoire partagée

Si vous ne vous souciez pas trop, la clé utilisée dans shmget était IPC_PRIVATE, mais en multi-processus, la mémoire partagée est créée pour chacun. Dans cet état, fork après la création du mutex fonctionne bien, mais si le fichier exécutable est différent, il ne peut pas être correctement exclu.

Par conséquent, en spécifiant la clé avec shmget, la même mémoire partagée peut être utilisée pour un autre fichier exécutable.

ftok crée une clé avec un chemin de fichier existant et un proj_id supérieur ou égal à 0.

2. Créer une mémoire partagée

Utilisez la clé créée pour shmget.

Si IPC_CREAT | IPC_EXCL est spécifié, la mémoire partagée pour la clé sera créée si elle n'existe pas et une erreur se produira si elle existe déjà. Cela permet de déterminer s'il faut ou non effectuer le traitement ultérieur lié à l'initialisation.

3. Créez un objet mutex sur la mémoire partagée

Créez un objet mutex comme d'habitude.

4. Verrouiller / déverrouiller avec mutex sur la mémoire partagée

Verrouillez / déverrouillez si nécessaire, comme d'habitude.

Résumé

--Si les fichiers exécutables sont différents, vous devez spécifier la clé de la mémoire partagée. --Si vous n'avez qu'un seul fichier exécutable, vous pouvez simplement utiliser pthread_mutexattr_setpshared. --IPC_PRIVATE peut être utilisé.

Préoccupation

--Confirmation de la probabilité de collision ftok

Recommended Posts

Méthode de contrôle exclusive multi-processus en langage C
Comment envelopper C en Python
Comment utiliser Google Test en langage C
Comment utiliser la bibliothèque C en Python
Comment générer une séquence en Python et C ++
Essayez de créer un module Python en langage C
Aller à la langue pour voir et se souvenir du langage Partie 7 C en langage GO
Intégration du langage machine en langage C
Comment développer en Python
Comment afficher la date de modification d'un fichier en langage C jusqu'à nanosecondes
Comment limiter la publication de l'API dans la bibliothèque partagée en langage C de Linux
[Go language] Comment obtenir l'entrée du terminal en temps réel
Comment implémenter provisoirement une barre de progression dans un langage de script
Comment créer et utiliser des bibliothèques statiques / dynamiques en langage C
J'ai essayé d'illustrer le temps et le temps du langage C
[Python] Comment faire PCA avec Python
Comment gérer une session dans SQLAlchemy
Test de module multi-instance en langage C
Comment utiliser les classes dans Theano
Comment écrire sobrement avec des pandas
Comment collecter des images en Python
Réaliser une classe d'interface en langage C
Comment mettre à jour Spyder dans Anaconda
Introduction à Protobuf-c (langage C ⇔ Python)
Comment convertir 0,5 en 1056964608 en un seul coup
Comment utiliser lentement le langage informatique 2
Comment refléter CSS dans Django
Comment tuer des processus en vrac
Comment utiliser Mysql avec python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Comment créer un pilote de langage MongoDB C
Comment exécuter du code TensorFlow 1.0 en 2.0
Comment utiliser lentement le langage informatique
Segfo avec 16 caractères en langage C
Comment gérer le japonais avec Python
Comment se connecter à Docker + NGINX
Comment appeler PyTorch dans Julia
Introduction à l'API Socket apprise en langage C, partie 1, édition serveur
[Langage C] Comment créer, éviter et créer un processus zombie
Comment utiliser les colonnes calculées dans CASTable
Liste de liens (list_head / queue) en langage C
[Introduction à Python] Comment utiliser la classe en Python?
Comment supprimer l'erreur d'affichage dans matplotlib
Contrôle exclusif avec fichier de verrouillage en Python
Comment définir dynamiquement des variables en Python
Comment faire R chartr () en Python
Comment supprimer des sessions expirées dans Django
[Itertools.permutations] Comment créer une séquence en Python
[Langage C] Je souhaite générer des nombres aléatoires dans la plage spécifiée
Comment implémenter un sérialiseur imbriqué avec drf-flex-fields
Comment utiliser BigQuery en Python
Comment exécuter des commandes avec Jupyter Notebook
Comment faire 'git fetch --tags' dans GitPython
Comment obtenir stacktrace en python
Comment afficher la table quatre-vingt-dix-neuf en python
Comment extraire une zone de polygone en Python
Comment réattribuer un index dans pandas dataframe