日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用)

發布時間:2025/3/20 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

linux 進程間通信 dbus-glib【實例】詳解一(附代碼)(d-feet工具使用)

linux 進程間通信 dbus-glib【實例】詳解二(上) 消息和消息總線(附代碼)

linux 進程間通信 dbus-glib【實例】詳解二(下) 消息和消息總線(ListActivatableNames和服務器的自動啟動)(附代碼)

linux 進程間通信 dbus-glib【實例】詳解三 數據類型和dteeth(類型簽名type域)(層級結構:服務Service --> Node(對象、object) 等 )(附代碼)

linux 進程間通信 dbus-glib【實例】詳解四(上) C庫 dbus-glib 使用(附代碼)(編寫接口描述文件.xml,dbus-binding-tool工具生成綁定文件)

linux 進程間通信 dbus-glib【實例】詳解四(下) C庫 dbus-glib 使用(附代碼)

文章目錄

  • dbus實例講解(一):初次見面
    • 1、dbus是什么東西?
    • 2、D-Bus的基本概念
      • 2.1、從例子開始
      • 2.2、名詞
        • 2.2.1、Bus Name
          • 2.2.1.1、可能有多個備選連接的公共名
          • 2.2.1.2、每個連接都有一個唯一名
          • 2.2.2、Object Paths
          • 2.2.3、Interfaces
          • 2.2.4、Methods和Signals
      • 2.3 小結
    • 3 下集預告

dbus實例講解(一):初次見面

網上有不少介紹dbus的文章。本文的目標是補充一些簡單的例子。

1、dbus是什么東西?

網上有一篇叫“D-Bus Tutorial”的文章,流傳較廣。不少介紹dbus的資料,都引用了其中的段落。 其實相對于這篇文章,我建議大家直接讀“D-Bus Specification”,篇幅不算長, 文字也不算枯燥。

D-Bus是針對桌面環境優化的IPC(interprocess communication )機制,用于進程間的通信或進程與內核的通信。最基本的D-Bus協議是一對一的通信協議。 但在很多情況下,通信的一方是消息總線(dbus daemon?)。消息總線是一個特殊的應用,它同時與多個應用通信,并在應用之間傳遞消息。下面我們會在實例中觀察消息總線的作用。 消息總線的角色有點類似與X系統中的窗口管理器,窗口管理器既是X客戶,又負責管理窗口。

支持dbus的系統都有兩個標準的消息總線:系統總線和會話總線。系統總線用于系統與應用的通信。會話總線用于應用之間的通信。 網上有一個叫d-feet的python程序,我們可以用它來觀察系統中的dbus世界。


D-Bus是一個程序。它提供了API。但我們一般不會直接使用dbus的接口。dbus-glib是GTK版本的dbus接口封裝。 本文假設讀者安裝了dbus-glib,我安裝的是dbus-glib-0.76。后面還會看到,通過python操縱dbus是多么簡單。

2、D-Bus的基本概念

2.1、從例子開始

我寫了一個最簡單的dbus服務器,它通過dbus提供了一個加法的接口。 大家可以下載這個例子。這是一個autotool工程,大家解包后,執行:

./autogen.sh ./configure make

然后在src目錄運行:

./example-service

這時再運行d-feet,連接session bus,在“Bus Name”窗口會看到一個叫“org.fmddlmyy.Test”連接名。
(d-feet我在ubuntu上用apt update && apt install d-feet安裝)

選擇“org.fmddlmyy.Test”,在右側窗口點擊展開“Object Paths”->“/TestObj”->“Interfaces”->“org.fmddlmyy.Test.Basic”->“Methods”,可以看到一個Add方法。雙擊Add方法,彈出下面這個對話框:


在Parameters窗口輸入“1,2”,點擊“Execute”按鈕,然后在“Output”窗口我們看到了輸出結果。我們剛剛創建了一個dbus服務并調用了它。

2.2、名詞

我們來解釋一下d-feet中出現的名詞。

2.2.1、Bus Name

可以把Bus Name理解為連接的名稱,一個Bus Name總是代表一個應用和消息總線的連接。 有兩種作用不同的Bus Name,一個叫公共名(well-known names),還有一個叫唯一名(Unique Connection Name)。

2.2.1.1、可能有多個備選連接的公共名

公共名提供眾所周知的服務。其他應用通過這個名稱來使用名稱對應的服務??赡苡卸鄠€連接要求提供同個公共名的服務,即多個應用連接到消息總線,要求提供同個公共名的服務。 消息總線會把這些連接排在鏈表中,并選擇一個連接提供公共名代表的服務??梢哉f這個提供服務的連接擁有了這個公共名。 如果這個連接退出了,消息總線會從鏈表中選擇下一個連接提供服務。公共名是由一些圓點分隔的多個小寫標志符組成的,例如“org.fmddlmyy.Test”、“org.bluez”。

2.2.1.2、每個連接都有一個唯一名

當應用連接到消息總線時,消息總線會給每個應用分配一個唯一名。唯一名以“:”開頭,“:”后面通常是圓點分隔的兩個數字,例如“:1.0”。 每個連接都有一個唯一名。在一個消息總線的生命期內,不會有兩個連接有相同的唯一名。 擁有公眾名的連接同樣有唯一名,例如在前面的圖中,“org.fmddlmyy.Test”的唯一名是“:1.17”。

有的連接只有唯一名,沒有公眾名??梢园堰@些名稱稱為私有連接,因為它們沒有提供可以通過公共名訪問的服務。 d-feet界面上有個“Hide Private”按鈕,可以用來隱藏私有連接。

2.2.2、Object Paths

Bus Name確定了一個應用到消息總線的連接。在一個應用中可以有多個提供服務的對象。這些對象按照樹狀結構組織起來。 每個對象都有一個唯一的路徑(Object Paths)?;蛘哒f,在一個應用中,一個對象路徑標志著一個唯一的對象。

“org.fmddlmyy.Test”只有一個叫作“/TestObj”的對象。圖1中的“org.bluez”有多個對象路徑。

2.2.3、Interfaces

通過對象路徑,我們找到應用中的一個對象。每個對象可以實現多個接口。例如:“org.fmddlmyy.Test”的“/TestObj”實現了以下接口:

org.fmddlmyy.Test.Basic org.freedesktop.DBus.Introspectable org.freedesktop.DBus.Properties

后面講代碼時會看到,我們在代碼中其實只實現了“org.fmddlmyy.Test.Basic”這個接口。 接口“org.freedesktop.DBus.Introspectable”和“org.freedesktop.DBus.Properties”是消息總線提供的標準接口。

2.2.4、Methods和Signals

接口包括方法和信號。例如“org.fmddlmyy.Test”的“/TestObj”對象的“org.fmddlmyy.Test.Basic”接口有一個Add方法。 后面的例子中我們會介紹信號。

標準接口“org.freedesktop.DBus.Introspectable”的Introspect方法是個很有用的方法。 類似于Java的反射接口,調用Introspect方法可以返回接口的xml描述。我們雙擊 “org.fmddlmyy.Test”->“/TestObj”->“Interfaces”->“org.freedesktop.DBus.Introspectable”的Introspect方法。 這個方法沒有輸入參數,我們直接點擊“Execute”按鈕,你在“Output”窗口看到了什么?

(我的點了pretty print還是雜亂格式😵)

后面我們會用另一種方式調用Introspect方法。

2.3 小結

“org.fmddlmyy.Test”->“/TestObj”->“Interfaces”->“org.freedesktop.DBus.Introspectable”的Introspect方法, 這個描述是不是很麻煩。其實前面還要加上“session bus”。

后面再看客戶端的C代碼時,我們會看到同樣的過程:用dbus_g_bus_get得到到session bus的連接。 在這個連接上用dbus_g_proxy_new_for_name函數獲得到擁有指定公共名的連接的指定對象的指定接口的代理。 最后,用dbus_g_proxy_call函數通過接口代理調用接口提供的方法。

3 下集預告

d-feet雖然很方便,但它使用了python的gtk模塊,在一些嵌入式環境可能使用不了。 后面會看到,用一個叫dbus-send的命令行工具,或者寫幾行python腳本都可以完成同樣的工作。 我們還會用一個叫dbus-monitor的命令行工具觀察dbus調用過程中究竟發生了什么?

參考文章:dbus實例講解(一):初次見面

總結

以上是生活随笔為你收集整理的linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。