基本概念 上(C API 級別的使用觀點)

2021-07-29 05:31:40 字數 4300 閱讀 7716

前面一篇講了dbus的 c 程式設計介面。現在開始解釋一下 dbus 的基本概念,順序反了,但和我的理解過程是一致的。看到 c 的程式設計介面之後,至少對於它的理解會有一定的感性認識。

dbus是用來進行程序間通訊的。下面這張圖展示了一些dbus的大部分東西,但是它太複雜了:

dbus 本身是構建在 socket 機制之上。真正的通訊還是由 socket 來完成的。dbus 則是在這之上,制定了一些通訊的協議,並提供了更高一層的介面,以更方便應用程式之間進行資料的互動。

在dbus的體系中,有乙個常駐的程序 daemon,所有程序間的互動都通過它來進行分發和管理。所有希望使用 dbus 進行通訊的程序,都必須事先連上 daemon,並將自己的名字註冊到 daemon 上,之後,daemon會根據需要把訊息以及資料發到相應的程序中。

首先使用

conn = dbus_bus_get(dbus_bus_session, &err);
讓應用程式和 dbus 之間取得連線。之後,使用函式

ret = dbus_bus_request_name(conn, "test.method.server",

dbus_name_flag_replace_existing

, &err);

將自己的程序名字註冊到 daemon 上。(參考前篇的[共通用**])。這樣通訊就有了基礎了。

dbus 提供的最簡單的一種通訊方式是訊號(signal),應用程式可以傳送乙個訊號到 daemon 上,之後,daemon 會根據訊號的種類和誰希望得到訊號等資訊,把相應的資料發給每個希望得到訊號的程序。也就是 signal 具有廣播的功能。訊號具有兩個基本的屬性,乙個是名稱,用來標識各個不同的訊號,乙個是資料,訊號是可以帶一定的資料的。signal 的通訊過程可以用下面的圖大概展示出來:

如果乙個程序(比如 b )想接收介面名為 test.signal.type 的訊號,那麼可以使用下面的函式向 daemon 新增匹配訊號,讓 daemon 知道自己對這種訊號感興趣。

// add a rule for which messages we want to see

dbus_bus_add_match(conn,

"type='signal',inte***ce='test.signal.type'",

&err); // see signals from the given inte***ce

然後, 程序 b 可以使用下面的函式來進行等待:

dbus_connection_read_write(conn, 0);

msg = dbus_connection_pop_message(conn);

一旦有訊息傳送過來,程序 b 就可以通過 msg 取到相應的資料了。(參考前篇**段[接收訊息1、2] )

現在有乙個程序 a,

dbus_uint32_t serial = 0; // unique number to associate replies with requests

dbusmessage* msg;

// create a signal and check for errors

msg = dbus_message_new_signal("/test/signal/object", // object name of the signal

"test.signal.type", // inte***ce name of the signal

"test"); // name of the signal

fprintf(stderr, "out of memory!\n");

exit(1);}

// send the message and flush the connection

if (!dbus_connection_send(conn, msg, &serial))

到這裡為止,已經涉及到了幾個基本而又核心的概念,搞清楚它們,幾乎就大概知道了 dbus 的使用方法了。

dbusmessage 是 dbus 中的核心資料結構。可以這樣理解:dbus中傳遞訊息資料的時候,就是通過它來傳遞的。對於使用者來說,dbusmessage 中儲存了兩種重要的資訊,一種是為通訊機**務的各種 name,一種是通訊的資料本身。

各種名字(name)

在前面用到的很多介面中都還有名稱/路徑字串作為引數。

dbus name:在 dbus 中最為重要的名字是「bus name」,bus name 是乙個每個應用程式(或是通訊物件)用來標識自己用的。幾乎可以當成是「ip」位址來理解。bus name有兩種,一種是「unique connection name」,是以冒號開頭的,是全域性唯一但「人類不友好」的命名,一種是「well-know name」,人類友好的。bus name 的命名規則是:

bus name 就像**一樣,由「.」號分割的多個子字串組成,每個子字串都必須至少有乙個以上的字元。

每個子字串都只能由「[a-z][a-z][0-9]_-」這些 ascii 字元組成,只有 unique name 的子串可以以數字開頭。

每個 bus name 至少要有乙個「.」,和兩個子字串,不能以「.」開頭

bus name 不能超過 255 個字元

幾個例子是:unique name   :392-2.33 org.freedesktop.dbus 等等

dbus name 是用來給應用程式進行標識自己的,所以每當程式連上 dbus daemon 後,就會分配到乙個 unique name,同時應用程式還可以要求自己分配另乙個 well-know name (通過 dbus_bus_request_name 函式)。

inte***ce name:dbus 也有 inte***ce 這個概念,主要是用來為更高一層的框架使用方面而設定的。在 c api 這一層,你幾乎可以無視這個概念,只需要知道這個乙個「字串」,並在訊息匹配是被 dbus 使用到,會隨著訊息在不同的程序之前傳遞,從程序 a 傳送乙個訊息或是資料到程序 b 時,其中必定會帶有乙個部分就是這個字串,至於 b 程序怎麼用(或是無視它)都可以。它的命名規則與 dbus name 幾乎是一樣的,只有一點要注意,inte***ce name 中不能帶有「-」字元。

object path:dbus 中的 object path,與 inte***ce 一樣,也只是個概念在更高一層的框架(qt dbus)中才比較有用,在 c api 這一層,幾乎可以無視這個概念,把它當成乙個普通的字串,根據通訊的需要,用來做一種標識和區分。object path 的命名規則是:/com/example/musicplayer1

object path 可以是任意長度的

以'/'開頭,並以以'/'分隔的若干子字串組成

每個子串必須由「[a-z][a-z][0-9]_」中的字元組成

不能有空子串(也就是不能連續兩個'/'符)

除了「root path」('/')之外,不能再有 object path 是以 '/' 結尾的了。

乙個 object path 的例子:/com/example/musicplayer1

member name:member 包含兩種型別,一種是 signal,一種是 method。在大多數方面,他們幾乎是一樣的,除了兩點:1. signal是在匯流排中進行廣播的,而method是指定發給某個程序的。2. signal 不會有返回,而 method 一定會有返回(同步的或是非同步的)。member name的命名規則是這樣的:

只能包含"[a-z][a-z][0-9]_"這些字元,且不能以數字開頭。不能包含「.」。

不能超過255個字元

到現在為止,已經介紹了三種最為重要的 name,如果與的熟悉 windows 訊息機制對比的話,我大概覺得,dbus name 就是程序的 id,有了這個你才能把訊息發給指定的程序,object path ,inte***ce等概念在「(qt等)高層框架中才有意義」,c api 級別的使用的話,可以無視它的概念,當成訊息甄別用的資訊就好了。 member name 相當於 message type,有了它你才知道怎麼去解析發過來的資料。

下篇將會記錄 dbusmessage 另乙個主要的組成部分:通訊資料。

**唐風:

事務的基本概念以及隔離級別

1.1 事務 所謂事務是使用者定義的乙個資料庫操作序列,這些操作要麼全做,要麼全不做,是乙個不可分割的單位。例如,在關係型資料庫中,乙個事務可以是一條sql語句 一組sql語句或者整個程式。在sql中,定義事務的語句一般有三條 begin transaction commit rollback 事務...

人臉識別的基本概念與閱讀文章

人臉識別 face recognizaton 按順序可以大體上分為四個部分,即人臉檢測 face detection 人臉對齊 face alignment 人臉校驗 face verification 和人臉識別 face identification 人臉檢測就是在一張中找到人臉所處的位置,即將...

ASE中事物的隔離級別 基本概念 強烈頂

ansi sql 標準定義了 4種隔離級別,用來在併發環境中規定資料庫事務對資料所做的改變對於其他事物來說哪些是可見的,哪些是不可見的。事物的隔離級越高,併發能力越差 系統開銷越大。因此,在進行應用開發時,在滿足需求的前提下,最好使用低隔離級別。sap sybase ase資料庫支援ansi sql...