转载请注明出处。               作者: 唐风  


最近在学 Dbus,不过总是不得其门而入。

大部分资料都讲了很多东西却最终没有让我搞清楚怎么用 DBus,不就是一个 IPC 通信的工具么?就没有一点实用些的资料么?看了很多资料之后还是觉得只见树木不见森林。仔细整理下思路,觉得还是应该从最基本的方面入门,先从 DBus 的 C API 入手学习,有了这些知识,就算麻烦,也可以先在完成一个基本功能的例子程序的同时大概的知道 DBus 的运行机制。

在网上找到这么一篇文章:http://www.matthew.ath.cx/misc/dbus, 正合我意,下面的内容基本是对这篇文章的翻译和扩充。

注意:

  1. 翻译没有得到原文作者同意,原文也很简单易懂,最好去读原文。如果收到投诉,我会立即撤掉本文的。
  2. 本文不是一篇好的 DBus 入门,有很多基本的东西不在记述之内。
  3. 一般情况下不会直接使用 C API 进行 DBus 的编程,而是使用某种 DBus-binding,但我觉得理解 DBus 的 C API 对完整地理解 DBus 是非常重要的。
  4. 虽然 DBus 是用 C 写的,而且本文写的是 C API,但是 DBus 设计中充满的面向对象的思想,请注意。


在使用 DBus 进行通信的时候,有一些代码是无论如何都会使用到的。首先,你必须要连接上 Dbus,一般来说,系统中会有一个 System Bus 和一个 Session Bus(他们的差别,请参考我另外的笔记)。其次,你需要在 Dbus 中注册一个名字,用于标识自己。为了简单起见,这里先不考虑重名的情况:

  • DBusError err;
  • DBusConnection* conn;
  • int ret;
  • // initialise the errors
  • dbus_error_init(&err);
  •  
  • // connect to the bus
  • conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
  • if (dbus_error_is_set(&err)) {
  •     fprintf(stderr, "Connection Error (%s)\n", err.message);
  •     dbus_error_free(&err);
  • }
  • if (NULL == conn) {
  •     exit(1);
  • }
  • // request a name on the bus
  • ret = dbus_bus_request_name(conn, "test.method.server",
  •                             DBUS_NAME_FLAG_REPLACE_EXISTING
  •                             , &err);
  • if (dbus_error_is_set(&err)) {
  •     fprintf(stderr, "Name Error (%s)\n", err.message);
  •     dbus_error_free(&err);
  • }
  • if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
  •     exit(1);
  • }
  • 相关文章:

    • 2022-12-23
    • 2022-01-01
    • 2021-09-22
    • 2021-06-22
    • 2021-12-31
    • 2021-11-26
    • 2022-12-23
    • 2022-12-23
    猜你喜欢
    • 2022-01-10
    • 2022-03-07
    • 2022-12-23
    • 2022-02-03
    • 2021-07-06
    相关资源
    相似解决方案