《Linux高階程式設計》讀書筆記8

2021-08-29 19:46:39 字數 4811 閱讀 2819

第十二章 自由桌面專案

典型的桌面都會有多個應用程式在執行,而且,它們經常需要彼此進行通訊。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則必須包含此檔案

/* 函式原型是

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;

}

dbus是與應用程式中的物件而不是應用程式自身進行通訊。在glib應用程式中,意味著是與gobject及其派生物件通訊。應用程式中,這些物件以應用程式位址空間中記憶體位址的形式傳遞,將這些記憶體位址傳遞給其他應用程式是沒有意義的。d-bus傳遞物件路徑,物件路徑類似於檔案系統路徑,例如/org/foo/bar等表示foo bar應用程式的頂層物件路徑。並不是必需的,但是這樣做可以避免產生衝突。

傳送給乙個物件的訊息型別:

方法呼叫(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,

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

dbus-get-hello.c :

#include #include #include /*

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;

}

為了確保正確地接受到訊號,我們必須確認擁有com.wiley.test命名空間:

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類,可以不設定析構...