分类: LINUX
2009-09-09 14:23:40
我本打算先对零八年做一番回顾,然后再写这篇关于DBus、关于进程间通信机制的文章。但每当我静下来,打算在脑中回映转瞬即逝的零八年时,思绪只能持续一小段时间,稍有走神,脑袋里面又满是和DBus相关的名词。所以我决定放下过去的一年,写完这篇文字先。
有人说,前苏联的飞行员一边看说明书,一边开飞机。当然,这句话的真实程度尚待考察,但程序员的生活,的确是一边学习新的技术,同时编写计算机程序。我最近两个月的工作就是这样,一边学习DBus,一边写相关代码,另外还要做些测试的工作。本来要在去年尾完成的工作,在新年过了十天才算大功告成。
想 来过去的八个月中我已经参与了四五个模块的代码编写了,写程序,计算机语言是需要掌握的,另外,还需要了解一些专业知识。掌握了开发语言固然重要,但要开 发安全相关的程序,就要学习数学和密码学;要模拟物体的运动就得学点物理;想编个阴阳历对照,还得知道中国古代是怎样计时的。用冯巩的话说就是:这年头都 讲究跨行业全面发展。乱扯这些,因为我参与的这些模块,需要的专业知识各不相同,而且进度很赶,完成之后没有时间去好好总结,也很少有机会对某一知识深知 熟谙。
不确定我的下一个任务是否还和DBus相 关,所以要趁还没有忘却它时,抓紧时间记下经验心得。对别人,是一种参考,或许可以少走弯路,对自己,是对工作和生活的总结记录,是激励和提升。我的朋友 和同学虽然大都在计算机行业混饭吃,但做的应该都是一边看说明书,一边开飞机的工作,工作中没有涉及到相关技术,就不需要深入了解DBus这个玩意。这篇文字贴在这里,只是记录我在08年的最后一个半月和09年的头一个星期玩过DBus这个东东,此外,我还会把它贴到CSDN上,以便和真正用到这个技术开发人员交流学习。
以下的文字包括三个部分,首先介绍什么是DBUS,为什么要使用它,接着罗列网上的资料资源,以便大家学习时更快的找到资料,最后给出五个程序,这五个程序分别指出使用DBUS时要注意的地方。
(一) 什么是DBUS?
DBUS是一种BUS,那什么又是BUS,初中时候学英语,学到Bus的时候知道它是公共汽车,坐上Bus可以从一个地方到另一个地方,后来学计算机,知道bus也是总线的意思,总线与公共汽车的不同在于:总线上跑的是计算机信号,公共汽车上坐的是人。所以,DBUS是一种用来做IPC(Inter-process communication),即进程间通信的机制。
为什么要使用DBUS,一个原因在于它的底层用socket实现,又去掉了socket的循环等待,迅速更快。另一个原因是linux的两种桌面坏境KDE和Gnome的通信机制是不同的(具体怎么不同,我也没有深究),DBUS的一个目标是实现一种能在KDE和Gnome两种环境下都能运行的IPC。最后,现在使用DBUS做IPC的项目越来越多。理由够充分吧
(二) 你能找到的资源。
(1)Connect desktop apps using D-BUS:http://www-128.ibm.com/developerworks/linux/library/l-dbus.html?ca=dgr-lnxw95D-BUS.
一个外国牛人写的有关DBUS的简介,附有简单的例程,但例程需要稍做修改才能编译通过,修改后的函数signal_filter和send_ping如下:
static DBusHandlerResult signal_filter(DBusConnection *connection, DBusMessage *message, void *user_data){
GMainLoop *loop = user_data;
if(dbus_message_is_signal(message, "org.freedesktop.Local", "Disconnected")){
g_main_loop_quit(loop);
return DBUS_HANDLER_RESULT_HANDLED;
}
else if(dbus_message_is_signal(message, "com.burtonini.dbus.Signal","Ping")){
DBusError error;
const char *str;
dbus_error_init(&error);
g_print("signal match\n");
if(dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &str, DBUS_TYPE_INVALID)){
g_print("Ping received : %s\n", str);
}
else{
g_print("Ping received, but error getting message : %s\n", error.message);
dbus_error_free(&error);
}
g_print("sub-function start running end \n");
return DBUS_HANDLER_RESULT_HANDLED;
}
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
static gboolean send_ping(DBusConnection *bus){
printf("this is sub function\n");
DBusMessage *message;
const char *v_STRING = "Ping!!!";
message = dbus_message_new_signal("/com/burtonini/dbus/ping", "com.burtonini.dbus.Signal", "Ping");
dbus_message_set_no_reply(message, TRUE);
dbus_message_append_args(message, DBUS_TYPE_STRING, &v_STRING, DBUS_TYPE_INVALID);
dbus_connection_send(bus, message, NULL);
dbus_message_unref(message);
g_print("Ping!\n");
return TRUE;
}
(2)http://hi.baidu.com/zengzhaonong/blog/item/670b98d6e63ae42c07088bae.html
这里的例子给出了DBus上几种消息的发送、接收程序框架,例子很容易看明白,一般在此框架上做些修改即可得到自己需要的代码。
(3)http://blog.csdn.net/fmddlmyy/archive/2008/12/23/3585730.aspx
这个博客的博主正准备详细深入的介绍DBus的方方面面,博主刚开始讨论DBus不久,博客还在持续更新中,估计博主已经在DBus上已经有深厚的功底,请特别关注 :》
(4)http://blog.chinaunix.net/u1/58649/showart_462468.html
这里是一个比较全的例子,600多行的程序涉及了DBus的方方面面,有极高的参考价值。
(5)http://blog.csdn.net/cuijpus
这个博客的博主是做手机开发的,在DBus上也有很深的功底,一些例程很值得学习。
(6)freedesktop.org - Software-dbus.url
DBus Home,这个是最重要也是最有价值的参考资料,DBus的相关源代码和文档都在这里,另外网站还给出了一些使用DBus的开放源代码项目列表,如果你编写DBus某一方面的代码时遇到困惑,网上又找不到可供参考的例子,到这些open source中去serch相关源代码或许是一个很有效的方法。