Question

Je n'ai jamais écrit d'IPC C ++ sous Linux auparavant.

Mon problème est que je vais avoir plusieurs clients (écrivains) et un seul serveur (lecteur). Tous seront sur la même machine. Les rédacteurs fourniront des morceaux de données (une chaîne / structure) au lecteur. Le lecteur les lira ensuite en FIFO et fera quelque chose avec eux.

Autant que je sache, les types d'IPC sous Linux sont Pipes ou Sockets / Message Queues.

Je me demandais si quelqu'un pourrait me recommander un chemin à suivre. Je me penche vers les orbites, mais je n'ai aucune base réelle pour cela. Y a-t-il quelque chose que je devrais lire / comprendre avant de commencer ce voyage?

Merci

Était-ce utile?

La solution

Le principal problème à prendre en compte est le type de données que vous transmettez, car cela déterminera en partie vos options. Cela revient à savoir si vos données sont liées ou non. Si ce n'est pas lié, alors quelque chose orienté comme les FIFO ou les sockets est approprié; Si c'est le cas, vous feriez peut-être mieux utiliser des éléments tels que les MQ ou la mémoire partagée. Puisque vous mentionnez à la fois les chaînes et les structures, il est difficile de dire ce qui est approprié dans votre cas. Toutefois, si vos chaînes sont limitées à un maximum raisonnable, vous pouvez utiliser n'importe quoi avec quelques manipulations mineures.

La seconde est la vitesse. Il n’existe jamais de réponse tout à fait correcte à cela, mais généralement cela ressemble à quelque chose: mémoire partagée, MQs, FiFO, sockets de domaine, sockets réseau.

Le troisième est la facilité d'utilisation. La mémoire partagée est le plus gros PITA puisque vous devez gérer votre propre synchronisation. Les pipes sont faciles tant que la longueur de votre message reste inférieure à la taille de PIPE_BUF. Le système d'exploitation gère la plupart de vos maux de tête avec des MQ. Les sockets sont assez faciles mais vous avez le passe-partout pour l'installation.

Enfin, plusieurs mécanismes IPC ont à la fois des variantes POSIX et SYSV. En général, POSIX est la voie à suivre à moins que le type SYSV ne présente une fonctionnalité dont vous avez réellement besoin ou que vous souhaitez.

EDIT: La réponse de Count0 m'a rappelé que vous pourriez être intéressé par quelque chose de plus abstrait et de plus haut niveau. Outre ACE, vous pouvez consulter Poco . Et, bien sûr, aucune réponse SO n'est complète si elle ne mentionne pas Augmentez quelque part.

Autres conseils

L’utilisation de System V IPC est un peu fastidieuse, mais c’est une technologie mature et robuste. Les files de messages feraient probablement ce que vous souhaitiez et soutiendraient la mise en file d'attente / la suppression de la file d'attente atomique.

Les sockets sont faciles à utiliser et supportent également la communication sur un réseau. Cependant, ils ne font pas de file d'attente, vous devez donc écrire le code de gestion de la file d'attente sur votre serveur. Utiliser des sockets avec C ++ n’est pas très différent de les utiliser avec C. Il existe de nombreux guides sur le Web et des ouvrages tels que «Unix Network Programming (vol 1)» de Stevens qui couvrent ce sujet de manière approfondie.

Ce tutoriel sur les sockets est un bon endroit pour vous familiariser avec la vie de tous les jours.

Vous aurez ensuite besoin de renforcer votre threads & amp; mutexes et ici .

Avec ce qui précède, vous êtes prêt à commencer à jouer; -)

Bien que vous n'ayez pas demandé de livres et que les réponses ci-dessus soient si bonnes, je ne vais que vous suggérer de mettre la main sur des copies de ces deux ouvrages:

Programmation réseau UNIX, Volume 2, Deuxième édition: Communications entre processus, W. Richard Stevens

Programmation avancée dans l'environnement UNIX, deuxième édition, W. Richard Stevens et Stephen A. Rago

Il y a inévitablement ins & amp; outs avec ce type de codage, ces deux livres vous aideront à surmonter la confusion que vous rencontrerez.

Essayez de consulter ACE (environnement de communication adaptative). . Les bibliothèques ACE sont disponibles gratuitement, très matures et multi-plateformes. Malheureusement, une bonne documentation ne l’est pas, je recommanderais ce livre de rechercher un bonne solution. Vous pouvez essayer de consulter ce didacticiel pour obtenir une sensation des motifs (à la fin du document). ACE utilise un ensemble de modèles pour traiter ces problèmes avec succès et efficacité, en particulier dans un contexte de réseau. Il devrait donc être un bon point de départ pour trouver de bons modèles et méthodes à utiliser.

Surtout Ace_Task en utilisant la Message_Queue , vous pouvez faire ce dont vous avez besoin.

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