第十二章 自由桌面專案
典型的桌面都會有多個應用程式在執行,而且,它們經常需要彼此進行通訊。dcop是乙個用於kde的 解決方案,但是它依賴於qt,所以不能用於其他桌面環境之中。類似的,bonobo是乙個用於gnome的解決方案,但是非常笨重,因為它是基於corba的。它還依賴於gobject,所以也不能用於gnome之外。 d-bus的目標是將dcop和bonobo替換為簡單的ipc,並整合這兩種桌面環境。由於盡可能地減少了d-bus所需的依賴,所以其他可能會使用d-bus的應用程式不用擔心引入過多依賴。
d-bus屬於freedesktop.org專案的一部分。bus守護程序,沒有使用常用的二進位制位元組流,而是使用了二進位制訊息的概念,訊息由訊息頭和相應的資料組成。
作業系統的概念: 包括核心、系統守護程序和程序。d-bus的設計目的:方便同乙個桌面會話中的多個應用程式之間的通訊;有助於桌面應用程式和作業系統之間的通訊。專門用於桌面的,可能不適用於其他方面的應用。
d-bus匯流排分類:系統匯流排和會話匯流排。
持久的系統匯流排(system bus),它在引導時就會啟動。這個匯流排由作業系統和後台程序使用,安全性非常好,以使得任意的應用程式不能欺騙系統事件。
還將有很多會話匯流排(session buses),這些匯流排當使用者登入後啟動,屬於那個使用者私有。它是使用者的應用程式用來通訊的乙個會話匯流排。當然,如果乙個應用程式需要接收 來自系統匯流排的訊息,它不如直接連線到系統匯流排----不過,它可以傳送的訊息將是受限的。
d-bus基礎
api沒有繫結到任何乙個特定的語言或框架。例如有glib/qt/python/c#的d-bus繫結。
使用d-bus傳送乙個訊息到匯流排
#include //要使用dbus則必須包含此檔案dbus是與應用程式中的物件而不是應用程式自身進行通訊。在glib應用程式中,意味著是與gobject及其派生物件通訊。應用程式中,這些物件以應用程式位址空間中記憶體位址的形式傳遞,將這些記憶體位址傳遞給其他應用程式是沒有意義的。d-bus傳遞物件路徑,物件路徑類似於檔案系統路徑,例如/org/foo/bar等表示foo bar應用程式的頂層物件路徑。並不是必需的,但是這樣做可以避免產生衝突。/* 函式原型是
dbusmessage* dbus_message_new_signal (const char *path,
const char *inte***ce,
const char *name) */
if (dbmsg == null)
text = "hello world";
dbus_connection_send (dbconn, dbmsg, null);
printf ("sending signal to d-bus\n");
dbus_message_unref (dbmsg);
dbus_connection_unref (dbconn);
return exit_success;
}
傳送給乙個物件的訊息型別:
方法呼叫(method calls)、方法返回(method returns)、訊號(signals) 和錯誤(errors)。
要執行 d-bus 物件的方法,您需要向物件傳送乙個方法呼叫訊息。它將完成一些處理並返回乙個方法返回訊息或者錯誤訊息。訊號的不同之處在於它們不返回任何內容:既沒有「訊號返回」訊息,也沒有任何型別的錯誤訊息。
dbus_int32_t v_int32 = 42;const char *v_string = "hello world";
dbus_type_int32, &v_int32,
dbus_type_string, &v_string,
dbus_type_invalid);
const dbus_int32_t array = ;
const dbus_int32_t *v_array = array;
dbus_type_array, dbus_type_int32, &v_array, 3,
dbus_type_invalid);
dbus_bool_t dbus_connection_send ( dbusconnection * connection,dbus-get-hello.c :dbusmessage * message,
dbus_uint32_t * serial
) connection the connection.
message the message to write.
serial return location for message serial, or null if you don't care
#include #include #include /*為了確保正確地接受到訊號,我們必須確認擁有com.wiley.test命名空間:cc $(pkg-config --cflags --libs dbus-glib-1) -o dbus-get-hello dbus-get-hello.c && ./dbus-get-hello
*/static dbushandlerresult
filter_func (dbusconnection *connection,
dbusmessage *message,
void *user_data)
else
}return (handled ? dbus_handler_result_handled : dbus_handler_result_not_yet_handled);
}int main (int argc, char *argv)
dbus_bus_request_name (dbconn, "com.wiley.test",
dbus_name_flag_replace_existing, &dberr);
if (dbus_error_is_set (&dberr))
if (!dbus_connection_add_filter (dbconn, filter_func, null, null))
return exit_failure;
dbus_bus_add_match (dbconn,
"type='signal',inte***ce='com.wiley.test'",
&dberr);
if (dbus_error_is_set (&dberr))
while (dbus_connection_read_write_dispatch (dbconn, -1))
; /* empty loop body */
return exit_success;
}
dbus_bus_request_name (dbconn, "com.wiley.test",dbus_name_flag_replace_existing, &dberr);
註冊過濾函式:
dbus_bool_t dbus_connection_add_filter ( dbusconnection * connection,確保訊號不會被忽略,因為通過匯流排傳送的訊號有很多,並非所有的應用程式都對它們感興趣,所以預設情況下,訊號將被忽略以阻止「訊號氾濫」。dbushandlemessagefunction function,
void * user_data,
dbusfreefunction free_data_function
)
// connection the connection
// function function to handle messages
// user_data user data to pass to the function
// free_data_function function to use for freeing user data
//adds a message filter.
if (!dbus_connection_add_filter (dbconn, filter_func, null, null))
return exit_failure;
dbus_bus_add_match (dbconn,一直監聽的**:"type='signal',inte***ce='com.wiley.test'",
&dberr);
if (dbus_error_is_set (&dberr))
dbus_bool_t dbus_connection_read_write_dispatch ( dbusconnection * connection,過濾函式的實現:int timeout_milliseconds
)
// an example usage would be:
while (dbus_connection_read_write_dispatch (connection, -1))
; // empty loop body
Linux網路程式設計讀書筆記 8
第十一章 資料結構的傳輸和 xdr標準 11.1 資料結構的傳送 網路資料結構傳遞可能存在以下問題 網路字序問題 浮點數傳輸 指標處理 自定義手工處理方式 將待傳送資料結構轉換以後放入應用的傳送緩衝區 將應用的接收緩衝區中資料結構轉換以後再進行資料處理。示例 void send int32 2buf...
《JavaScript高階程式設計》讀書筆記
1 函式名帶括號和不帶括號的區別 函式名本身就是變數,要訪問函式的指標而不執行函式的話,必須去掉函式名後面的圓括號。2 protptype屬性 prototype是儲存引用型別所有例項方法的真正所在。諸如tostring 和valueof 等方法都是儲存在prototype下,只不過是通過各自物件的...
unix 環境高階程式設計 讀書筆記
unix環境高階程式設計 讀書筆記 第8章exit和 exit區別 exit會直接進入核心,不會關閉io流。程序基本控制函式還有 wait,fork,exec。atexit 程式正常退出時呼叫,如果因為signal退出則不能呼叫。功能 註冊函式可以完成一些清理工作,比如全域性log類,可以不設定析構...