D-BUS est un système de communication interprocessus (IPC) qui fournit un mécanisme simple et puissant permettant aux applications d’échanger des informations entre elles et de lancer des demandes de service. D-BUS a été conçu dès le départ pour répondre aux besoins des systèmes Linux modernes. L’objectif principal de D-BUS est de remplacer les systèmes d’appel d’objets à distance tels que CORBA et DCOP, utilisés respectivement dans GNOME et KDE. Idéalement, D-BUS devrait fournir un système de communication inter-processus unifié et flexible pour ces deux environnements de bureau, répondant à leurs besoins et pouvant être utilisé pour implémenter de nouvelles fonctionnalités.
D-BUS, en tant que système complet de communication interprocessus et d’appel d’objets à distance, a un certain nombre d’applications typiques. Tout d’abord, D-BUS peut être utilisé pour la communication interprocessus classique, permettant à un processus de transmettre des données à un autre – en tant qu’implémentation améliorée des sockets de domaine UNIX. Deuxièmement, D-BUS peut simplifier l’envoi de messages ou de signaux d’événements au sein d’un système, ce qui permet à divers composants du système de répondre à des événements et, en fin de compte, d’améliorer l’intégration de ces composants. Par exemple, le service Bluetooth peut envoyer un signal d’appel entrant, ce qui permet au lecteur de musique de couper le son de l’appel avant qu’il ne prenne fin. Enfin, D-BUS autorise les demandes de service et les appels de méthode à partir d’autres objets – comme CORBA, mais sans la complexité.
Pourquoi D-BUS est unique
Le système D-BUS est différent des autres systèmes de communication interprocessus pour plusieurs raisons. Tout d’abord, l’unité de base de la communication interprocessus dans D-BUS est un message, et non un flux de données. Ainsi, D-BUS divise les données des applications communicantes en messages individuels composés d’en-têtes (métadonnées) et de charges utiles (données). Les messages sont dans un format binaire, typés, entièrement alignés et simples. Cette partie du protocole est héritée des protocoles de communication en réseau. Cette approche diffère considérablement de celle utilisée dans d’autres systèmes de communication interprocessus, qui utilisent massivement des flux d’octets différents plutôt que des messages individuels.
Deuxièmement, D-BUS est basé sur le concept de bus. La forme la plus simple de communication entre processus est le transfert de données d’un processus à l’autre. Cependant, D-BUS fournit un service système, connu sous le nom de service de bus de messages système, qui achemine les messages entre les processus sur un bus particulier. Ce service met en œuvre une topologie de bus qui permet aux processus d’envoyer des messages à une ou plusieurs applications simultanément. Les applications peuvent envoyer ou s’attendre à recevoir différents événements sur le bus.
La dernière caractéristique unique est la création non pas d’un mais de deux bus à la fois : un bus système et un bus de session. Le bus système est un bus global fonctionnant au niveau du système. Tous les utilisateurs du système disposant des droits appropriés peuvent utiliser ce bus, qui introduit le concept d’événements à l’échelle du système. Le bus de session est créé lorsqu’un utilisateur se connecte et fonctionne au niveau de l’utilisateur ou de la session. Ce bus est utilisé exclusivement par un utilisateur particulier au sein d’une session particulière en tant que système de communication inter-processus et d’invocation d’objets à distance pour les applications utilisateur.
Concepts du D-BUS
Les messages sont envoyés aux objets. Les objets sont adressés en utilisant des chemins tels que /org/cups/printers/queue. Les processus du bus sont associés à des objets et mettent en œuvre des interfaces avec ces objets.
D-BUS prend en charge de nombreux types de messages tels que : les signaux, les appels de méthode, les résultats des appels de méthode de retour et les messages d’erreur. Les signaux font référence aux notifications de l’occurrence de certains événements. Il s’agit de messages simples, asynchrones et à sens unique. Les messages d’appel de méthode permettent à une application d’envoyer une demande d’appel de méthode à un objet distant. Les messages renvoyant le résultat d’un appel de méthode fournissent la valeur renvoyée à la suite de l’appel de méthode. Les messages d’erreur permettent de gérer les exceptions résultant des appels de méthode.
Le système D-BUS utilise un typage complet et l’utilisation sûre des types est possible. L’en-tête du message et les données utilisables sont entièrement typés. Les types de données pris en charge sont les suivants : octets, booléens, entiers de 32 bits, entiers non signés de 32 bits, entiers de 64 bits, entiers non signés de 64 bits, virgule flottante à double précision et chaînes de caractères. Un type de tableau spécial permet de regrouper ces valeurs. Le type dictionnaire (DICT) permet de créer des paires clé/valeur.
Le système D-BUS est sécurisé. Il met en œuvre un protocole simple basé sur les profils SASL pour l’authentification des connexions d’application individuelles. Au niveau du bus, la lecture et l’écriture de messages à partir d’une interface particulière sont contrôlées par le système de sécurité. L’administrateur peut contrôler l’accès de n’importe quelle interface au bus. D-BUS a été conçu à l’origine dans un souci de sécurité.
Pourquoi utiliser D-BUS
Tout cela semble formidable, mais quels en sont les avantages ? Tout d’abord, le concept de bus système est une innovation. Un bus unique accessible à tous les composants du système permet de distribuer des messages depuis les événements du noyau (voir « Couche d’événements du noyau ») vers des applications de plus haut niveau au sein du système. Linux, avec ses interfaces bien conçues et ses niveaux de système clairement séparés, ne disposait pas d’un bon système d’intégration. Le bus système D-BUS améliore l’intégration des composants du système sans enfreindre les règles de développement bien établies. Des événements tels qu’un disque dur plein ou une file d’attente d’impression vide, ou même une batterie d’ordinateur portable déchargée, peuvent désormais être accompagnés d’une infobulle dans la barre d’état système et d’un événement disponible pour les applications concernées, ce qui permet au système de répondre et de réagir en conséquence. Les alertes sont envoyées de manière asynchrone, sans qu’il soit nécessaire de vérifier en permanence l’existence de nouveaux événements.
Couche d’événements du noyau
La couche d’événements du noyau fait référence au mécanisme de messagerie entre l’espace du noyau et l’espace utilisateur, mis en œuvre à l’aide d’un socket netlink à grande vitesse. Ce mécanisme est lié au système D-BUS et permet au noyau de générer des signaux D-BUS !
La couche événementielle du noyau est liée au système de fichiers sysfs, qui est un mappage des objets internes du noyau (kobjects) et se trouve dans /sysfs dans les distributions Linux modernes. Chaque répertoire sysfs est associé à un objet du noyau (kobject), qui est une structure du noyau destinée à la représentation interne des objets ; sysfs est une hiérarchie d’objets exportés du noyau en tant que système de fichiers.
Chaque événement du noyau est modélisé de telle sorte qu’un chemin dans le système de fichiers sysfs est donné comme initiateur. De cette manière, les événements semblent être initiés par des objets du noyau. Les chemins du système de fichiers sysfs sont facilement traduits en chemins d’objets D-BUS, ce qui permet de relier la couche d’événements du noyau et le système D-BUS de manière naturelle. La couche d’événements du noyau a été introduite pour la première fois dans la version 2.6.10-rc1 du noyau.
Deuxièmement, le bus de session fournit des mécanismes pour la communication inter-processus et les appels de procédure à distance, fournissant potentiellement un système unifié pour GNOME et KDE. L’objectif de D-BUS est de fournir un système avec des caractéristiques CORBA meilleures que CORBA et un système avec des caractéristiques DCOP meilleures que DCOP, satisfaisant les besoins des deux projets tout en fournissant des caractéristiques supplémentaires.
En outre, D-BUS possède ces caractéristiques tout en restant un système simple et efficace.
Ajoutez le support D-BUS à vos applications
La base du système D-BUS est développée dans le langage de programmation C et son API est vaste et de relativement bas niveau. Des API de haut niveau sont utilisées au-dessus de cette API pour divers langages de programmation et composants, notamment Glib, Python, Qt et Mono. En plus de fournir des API pour différents langages de programmation, les API de haut niveau fournissent également un support pour les fonctions spécifiques aux composants individuels du système. Par exemple, les API Glib présentent les connexions D-BUS comme des GObjects et permettent d’envoyer des messages pour les intégrer dans la boucle d’événements (Glib mainloop). La méthode préférée pour utiliser D-BUS dans un programme est d’utiliser des API de haut niveau pour le langage de programmation et le composant logiciel choisis afin d’obtenir une facilité d’utilisation et une fonctionnalité accrue.
Conclusion
D-BUS est un système de communication interprocessus puissant et simple qui permettra d’améliorer l’intégration et la fonctionnalité des systèmes Linux. Les utilisateurs rencontreront tôt ou tard de plus en plus d’applications utilisant D-BUS. Avec cet article en main, il y a toutes les raisons de considérer D-BUS non pas comme une terrible addiction, mais comme une brillante fonctionnalité du système. Vous pouvez trouver un certain nombre d’exemples de programmes utilisant D-BUS sur les ressources Internet. Les développeurs seront finalement contraints d’ajouter la prise en charge de D-BUS à leurs applications. Il existe également un certain nombre de sites web contenant des descriptions et des exemples d’utilisation de D-BUS. Bien entendu, le meilleur matériel de référence est le code source, et heureusement, il y en a beaucoup aujourd’hui.