2010-06-23 6 views

Répondre

3

Oui. Mais il ne contient pas de solution IPC complète et n'est probablement pas parfaitement compatible avec toutes les implémentations IPC existantes. Avec les parents et les enfants, je suppose que vous voulez dire le serveur et les clients? Généralement, vous ouvrez une sorte de connexion réseau ou créez un canal pour la communication et vous obtenez un descripteur de fichier (même si vous utilisez une bibliothèque de haut niveau qui le cache). Vous pouvez passer ce descripteur de fichier à glib et recevoir un rappel, puis des données sont disponibles pour la lecture (ou la connexion est fermée). Certaines méthodes IPC populaires comme CORBA et DBUS ont déjà une intégration glib de sorte que vous n'avez même pas besoin de vous soucier des descripteurs de fichiers et autres. La boucle d'événement glib est décrite here. Cela peut sembler complètement complexe comparé à l'utilisation directe de poll() mais d'un autre côté, il est très portable. L'utilisation de base est de créer une source avec g_source_new() et de l'ajouter à votre contexte principal avec g_source_attach(), puis d'ajouter votre descripteur de fichier à la source avec g_source_add_poll().

Si vous ne vous êtes pas encore décidé sur glib, vous voudrez peut-être vérifier libevent avec la même chose que glib mais est (IMHO) beaucoup plus facile à utiliser. Il est également nettement mieux de gérer plus de 1000 clients simultanés (au moins sous Linux, d'autres systèmes d'exploitation peuvent même ne pas supporter cela). Mais d'un autre côté, ce n'est pas aussi portable et ne fonctionnera probablement que sur des systèmes compatibles avec Posix.

+0

Non, pas le serveur et les clients. J'ai un processus parent (maître) et environ 10 enfants. Je veux que les enfants écoutent les commandes parent (par exemple, die(), reload_config(), do_this(), do_that()) et parent pour écouter les commandes enfants (par exemple, i_have_finished()). Je n'ai pas besoin de 1000 clients simultanés, seulement environ 10. Et les commandes sont rares. –

+0

Si les enfants sont des processus locaux démarrés par le maître, alors c'est une tâche simple que seul peut résoudre (si les enfants sont distants, vous devez les configurer vous-même, sinon ce n'est pas très différent). Vous pouvez utiliser g_spawn_async_with_pipes() pour lancer un processus fils et obtenir les descriptiors de fichier (à utiliser comme décrit ci-dessus). Vous obtenez également un PID qui peut être utilisé pour obtenir un rappel, puis l'enfant se termine avec g_child_watch_add(). – Grim