Qu'est-ce qu'un bon moyen portable pour mettre en œuvre un événement signalable mondial dans un environnement POSIX

StackOverflow https://stackoverflow.com/questions/4326211

  •  29-09-2019
  •  | 
  •  

Question

Le cas d'utilisation est qu'une application génère un événement et envoie un signal que toute application qui prend soin d'écouter pour cela obtenir. Par exemple. une application met à jour le contenu d'un fichier et le signale. Sous Linux, cela pourrait se faire par les serveurs d'appel inotify sur le fichier. Une façon portable serait pour les auditeurs d'enregistrer avec un serveur bien connu, mais je préférerais quelque chose plus simple si possible. Portable possible signifie idéalement en utilisant uniquement des caractéristiques qui sont POSIX également largement disponibles.

Était-ce utile?

La solution

Option en utilisant les fichiers de verrouillage

Vous pouvez le faire en verrouillant un fichier.

émetteur de la configuration initiale du signal:

  • Créez un fichier avec un nom bien connu et le verrouiller pour écrire (fcntl(F_SETLK) avec F_WRLCK ou troupeau (LOCK_EX) `).

procédure de réception de signal:

  • Ouvrez le fichier en utilisant le nom de fichier bien connu et essayer d'obtenir un verrou de lecture sur elle (fcntl(F_SETLK) avec F_RDLCK ou flock(LOCK_SH)).
  • blocs récepteur parce que l'émetteur détient un verrou d'écriture en conflit.

émission du signal:

  • émetteur de signal crée un nouveau fichier temporaire
  • émetteur de signal obtient un verrou d'écriture sur le nouveau fichier temporaire
  • émetteur de signal renomme le nouveau fichier temporaire au nom bien connu. Ce aplatit l'ancien fichier de verrouillage, mais les récepteurs d'attente conservent toutes les références à.
  • Signal émetteur ferme l'ancien fichier de verrouillage. Cela libère également le verrou.
  • Signal tous les récepteurs réveil parce que maintenant ils peuvent obtenir leurs verrous de lecture.
  • récepteurs de signaux doivent fermer le fichier qu'ils ont juste obtenu un verrou sur. Il ne sera pas utilisé à nouveau. S'ils veulent attendre la condition de se produire à nouveau, ils devraient rouvrir le dossier.

Dans l'émetteur du signal, le fichier de verrouillage temporaire qui a été renommé au-dessus du fichier de verrouillage d'origine devient le nouveau fichier de verrouillage actuel.

Option en utilisant multidiffusion

réseau

Demandez aux récepteurs se joindre à un groupe de multidiffusion et d'attente pour les paquets. Avoir l'émetteur le signal envoyer des paquets UDP à ce groupe de multidiffusion.

Vous pouvez lier à la fois l'envoi et la réception des prises UDP à l'interface loopback si vous voulez utiliser la communication que l'hôte local.

Autres conseils

A la fin j'utilise un socket de domaine Unix lié. Le propriétaire conserve un tableau de FDs client et envoie chaque message quand il y a un événement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top