Communication Inter-Processus De Recommandation
Je suis à la recherche de la lumière-poids, moyen rapide et facile pour gérer les Inter Processus Communication entre certains programmes sur une machine Linux.
Actuellement, je suis en train de penser canal Nommé, parce qu'il est fourni par le système d'exploitation lui-même. Existe-il des mises en garde concernant les performances ou la convivialité?
Serait de Mémoire Partagée de mieux?
Je ne pense pas que j'ai besoin d'un super-complexe.
Merci de me pointer dans la bonne direction, merci!
Mise à jour:
Je veux construire un petit programme (démon) qui indique aux autres programmes (qui elle-même commence) à la pause, rapport de leur état, arrêt, etc.
De sorte que le programme doit être averti qu'une nouvelle commande est en attente pour elle. Une pipe n'est pas l'idéal pour qui est-il?
OriginalL'auteur brandstaetter | 2009-12-15
Vous devez vous connecter pour publier un commentaire.
Boost a une belle Interprocessus de la bibliothèque qui est multi-plateforme et assez intuitive.
J'ai seulement joué avec elle, donc il pourrait y avoir de meilleures alternatives.
Toutefois, si vous n'avez pas vraiment besoin de la mémoire partagée, je m'en tiendrais à une messagerie approche. Vous allez éviter les blocages et des conditions de course. Le tuyau principe est vraiment génial, et il permet même pour les paresseux comportements qui peuvent sauver que vous beaucoup de traitement en fonction de la question à portée de main!
OriginalL'auteur Matthieu M.
Comme vous l'avez vu, vous pouvez utiliser pour la communication interprocessus :
Mémoire partagée a l'avantage de performance, parce que vous n'avez pas une mémoire tampon lors de l'envoi/réception de messages. Mais vous devez synchroniser les données de votre échange avec une autre classe de la CIB. Il peut être CIB sémaphores ou ... les canaux nommés ou sockets.
Lorsque la performance n'est pas l'objectif principal, j'ai tendance à préférer les sockets que leur utilisation est simple et peut être étendu à d'inter communication avec un ordinateur.
La meilleure façon est de résumé de votre communication avec une classe qui peut utiliser la mémoire partagée lorsque les deux processus sont sur le même ordinateur et prises de courant si pas. Ensuite, Vous avez à choisir entre UDP et TCP 😉
De synchro /échange de tampon, préférez TCP comme plus fiable.
Je ne suis pas d'utiliser des canaux nommés comme je préfère le socket de la possibilité d'utiliser l'inter ordinateur communicationand bien sûr, vous pouvez trouver beaucoup de portable socket bibliothèques...
my2cents
EDIT:
Pour la synchronisation, partagé mem est peut-être pas le meilleur outil. Dans votre cas, il peut être utilisé par le partage d'un petit espace de mémoire, avec un espace pour chaque processus d'attente pour les commandes. Vous pouvez soit sondage pour toute incomming commande ou l'utilisation d'un sémaphore partagé. Le moyen le plus rapide est de votre processus en attente nommé sémaphores et de la lecture partagée mem espace pour leurs commandes et les paramètres. L'utilisation de canaux nommés est sûrement plus simple mais pas que rapide. Certainement que vous n'avez pas besoin d'être si vite ? De toute façon abstraite que dans une classe de modèles de votre protocole d'échange et d'essayer les deux façons de faire 🙂
Dans ce cas, partagé mem est la voie. Plus les données au mieux le gain de performance. D'autres CIB (et socket) bufferize, même si elles sont optimisées. Avec partagé mem, vous êtes sûr il n'y a pas de tampon dessus. Nous utilisons partagé mem pour l'échange d'images. La synchro peut être fait avec un tube nommé ou un (local) socket, plus facile à gérer que partagé sémaphore (et plus portable). Vous pouvez même le faire sans en fonction de vos données / un protocole d'échange de ...
+1 pour la couche d'abstraction
merci. Il s'avère toujours une bonne chose particurlarly lorsque vous traitez avec interface externe 🙂
OriginalL'auteur neuro
Un bon choix est d'utiliser par socketpair, très rapide et efficace.
OriginalL'auteur lsalamon
D-Bus est très utile et très stable pour faire de la cib dans le même hôte.
http://www.freedesktop.org/wiki/Software/dbus
OriginalL'auteur GabiMe
J'utilise les sockets unix, ou une bibliothèque qui les enveloppe. Les sockets Unix sont assez facile à utiliser.
D'autre part, si vous avez de taille fixe informations sur l'état du rapport, vous avez juste demandez à l'enfant de processus écrire dans un fichier (on peut supposer qu'elle est petite et vous ne serez pas fsync, afin de ne pas générer d'importants IO de la charge de travail).
OriginalL'auteur MarkR
De la mémoire partagée avec les sémaphores est le plus rapide et le plus transparent, si vous voulez construire le logiciel directement à partir de l'primitives.
Canaux nommés ne sont pas trop différents des tuyaux et des travaux bien entre une paire de processus et non sur un serveur et plusieurs clients.
Si vous voulez construire l'infrastructure existante, dBus est une option.
Communication par Socket est polyvalent et échelles eh bien, si vous souhaitez déplacer vos applications sur les machines sur un réseau.
OriginalL'auteur kjohri