dbus-daemon是乙個後台程序,負責訊息的**。它就像個路由器。最常見的基於dbus的程式也是符合c/s結構的。
比如我們自己寫了兩個程式,a和b,其中a是客戶,b是服務。假設a要呼叫b的乙個函式c,那麼實際的訊息流動方向是:a告訴dbus-daemon我要呼叫b的c函式,然後dbus-daemon則去呼叫b的c函式,如果c有返回值的話,b會把返回值告訴dbus-daemon,然後dbus-daemon再把返回值告訴a。由此可以看出,dbus-daemon是很關鍵的乙個後台程序。
以ubuntu為例,通常情況下,會有兩個dbus-daemon程序,乙個是屬於system的,乙個是屬於session的,這兩個程序,都是在使用者登入的時候由dbus-launch啟動的。
大多數普通程式,都是使用session的dbus-daemon,預設情況下,a就是將訊息發給了這個屬於session的dbus-daemon。
但是在除錯過程中,有時想看到一些更詳細的資訊,因此可以自己再啟動乙個dbus-daemon,現在就有乙個問題,a的訊息是流向了哪乙個dbus-daemon?
其實dbus-daemon是有位址的,而且有乙個環境變數來表示它--dbus_session_bus_address,可以用命令env檢視到。我們的程式,也就就是依靠這個環境變數來確認使用哪乙個dbus-daemon的。
當我們登入進桌面環境的時候,系統啟動指令碼會呼叫到dbus-launch來啟動乙個dbus-daemon,同時會把這個dbus-daemon的位址賦予環境變數dbus_session_bus_address。
一般情況下,我們是不需要考慮dbus_session_bus_address的,但是,有些時候,單獨啟動乙個dbus-daemon,則有助於程式的除錯。
比如,還是假設我們寫了兩個程式,a和b,其中a是客戶,b是服務。同時還使用dbus的自啟動功能(簡要說明一下,什麼是dbus的自啟動----a要呼叫b的函式,如果b程序還沒有啟動,則dbus-daemon會自動的先把b程序啟動起來,這就是自啟動)。
由於利用dbus-daemon自啟動機制執行的服務程序,都是後台程序,標準輸出裝置已經被重定向了,如果b程序有一些除錯用的列印資訊,則很難直接檢視。
這個時候,就可以單獨啟動乙個dbus-daemon,讓a和b都使用我們自己啟動的這個dbus-daemon,此時,這個dbus-daemon還能把b的列印資訊顯示出來。
先在終端下啟動乙個dbus-daemon,命令如下形式如下:
dbus_verbose=1 dbus-daemon --session --print-address
這樣的話,該dbus-daemon會前台執行,並且列印出它的位址,位址形式類似於unix:abstract=/tmp/dbus-ycjsnnpjhg,guid=18b385acdbd58611ffd3196b4beb69f0
然後,在執行我們的a程式的時候,設定環境變數dbus_session_bus_address為剛才得到的位址值,例如這樣執行a程式:
dbus_session_bus_address=unix:abstract=/tmp/dbus-ycjsnnpjhg,guid=18b385acdbd58611ffd3196b4beb69f0 ./a
這樣的話,我們的程式a和b,就是使用我們自己啟動的這個dbus-daemon來**訊息了。同時,剛才啟動dbus-daemon的那個終端,還會把b的列印資訊顯示出來。
所有使用到dbus技術的程式,都會用到dbus_session_bus_address環境變數,所以,我們也可以用這個環境變數來控制dbus-monitor的行為。
如何測試 DBUS Daemon
方法如下 dbus daemon print address config file home charles code dbus cmake cmake bus session.conf unix abstract tmp dbus zfkhkbvswm,guid 6fcb847152517d1d...
Linux 使用技巧
1.使用虛擬控制台 登入後按alt f2鍵這時又可以看到 login 提示符,這個就是第二個虛擬控 制台.一般新安裝的linux有四個虛擬控制台,可以用alt f1 alt f4來訪問.虛擬 控制台最有用的時候是當乙個程式出錯鎖住輸入時可以切換到其他虛擬控制台登入 進入後殺掉這個出錯的程序.2.拷貝...
WinCVS使用技巧
更新 update 1,上傳之前先update,為了保證 與伺服器上統一。update 預設 會將伺服器上有的 而本地沒有的 更新到本地,之後再commit才不會出現 遺失。在update時,可能會使有些檔案衝突,需要手動解決。2,獲取伺服器上的版本。update 選中 get the clean ...