1)使用 DBUS low-level API
dbus-ping-listen.c:
#include <glib.h> #include <dbus/dbus-glib.h> #include <dbus/dbus.h> static DBusHandlerResult signal_filter (DBusConnection * connection, DBusMessage * message, void *user_data); int main (int argc, char **argv) { GMainLoop *loop; DBusConnection *bus; DBusError error; loop = g_main_loop_new (NULL, FALSE); dbus_error_init (&error); bus = dbus_bus_get (DBUS_BUS_SESSION, &error); if (!bus) { g_warning ("Failed to connect to the D-BUS daemon: %s", error.message); dbus_error_free (&error); return 1; } dbus_connection_setup_with_g_main (bus, NULL); /* listening to messages from all objects as no path is specified */ dbus_bus_add_match (bus, "type='signal',interface='com.burtonini.dbus.Signal'", &error); dbus_connection_add_filter (bus, signal_filter, loop, NULL); g_main_loop_run (loop); return 0; } static DBusHandlerResult signal_filter (DBusConnection * connection, DBusMessage * message, void *user_data) { /* User data is the event loop we are running in */ GMainLoop *loop = user_data; /* A signal from the bus saying we are about to be disconnected */ if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")) { /* Tell the main loop to quit */ g_main_loop_quit (loop); /* We have handled this message, don't pass it on */ return DBUS_HANDLER_RESULT_HANDLED; } /* A Ping signal on the com.burtonini.dbus.Signal interface */ else if (dbus_message_is_signal (message, "com.burtonini.dbus.Signal", "Ping")) { DBusError error; char *s; dbus_error_init (&error); if (dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID)) { g_print ("Ping received: %s\n", s); // dbus_free (s); } else { g_print ("Ping received, but error getting message: %s\n", error.message); dbus_error_free (&error); } return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; }
#include <glib.h> #include <dbus/dbus-glib.h> #include <dbus/dbus.h> static gboolean send_ping (DBusConnection * bus); int main (int argc, char **argv) { GMainLoop *loop = NULL; DBusConnection *bus; DBusError error; /* Create a new event loop to run in */ loop = g_main_loop_new (NULL, FALSE); /* Get a connection to the session bus */ dbus_error_init (&error); bus = dbus_bus_get (DBUS_BUS_SESSION, &error); if (!bus) { g_warning ("Failed to connect to the D-BUS daemon: %s", error.message); dbus_error_free (&error); return 1; } /* Set up this connection to work in a GLib event loop */ dbus_connection_setup_with_g_main (bus, NULL); /* Every second call send_ping() with the bus as an argument */ g_timeout_add (1000, (GSourceFunc) send_ping, bus); /* Start the event loop */ g_main_loop_run (loop); return 0; } static gboolean send_ping (DBusConnection * bus) { DBusMessage *message; const char *v_string = "Ping!"; /* Create a new signal "Ping" on the "com.burtonini.dbus.Signal" interface, * from the object "/com/burtonini/dbus/ping". */ message = dbus_message_new_signal ("/com/burtonini/dbus/ping", "com.burtonini.dbus.Signal", "Ping"); /* Append the string "Ping!" to the signal */ dbus_message_append_args (message, DBUS_TYPE_STRING, &v_string, DBUS_TYPE_INVALID); /* Send the signal */ dbus_connection_send (bus, message, NULL); /* Free the signal now we have finished with it */ dbus_message_unref (message); /* Tell the user we send a signal */ g_print ("Ping!\n"); /* Return TRUE to tell the event loop we want to be called again */ return TRUE; }编译命令
gcc dbus-ping-listen.c `pkg-config --cflags --libs dbus-1 dbus-glib-1 glib-2.0` -g -o dbus-ping-listen gcc dbus-ping-send.c `pkg-config --cflags --libs dbus-1 dbus-glib-1 glib-2.0` -g -o dbus-ping-send
~/code/dbus$ ./dbus-ping-send Ping! Ping! Ping! Ping! Ping! ~/code/dbus$ ./dbus-ping-listen Ping received: Ping! Ping received: Ping! Ping received: Ping! Ping received: Ping!
http://www.ibm.com/developerworks/cn/linux/l-dbus.html
修改了一些编译和运行时的错误。