Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191072
  • 博文数量: 49
  • 博客积分: 2065
  • 博客等级: 大尉
  • 技术积分: 413
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-08 17:04
文章分类

全部博文(49)

文章存档

2012年(2)

2010年(17)

2009年(30)

我的朋友

分类: LINUX

2009-09-09 14:23:40

DBUS编程二三事<1>

我本打算先对零八年做一番回顾,然后再写这篇关于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的两种桌面坏境KDEGnome的通信机制是不同的(具体怎么不同,我也没有深究),DBUS的一个目标是实现一种能在KDEGnome两种环境下都能运行的IPC。最后,现在使用DBUSIPC的项目越来越多。理由够充分吧

 

(二)   你能找到的资源。

1Connect desktop apps using D-BUS:http://www-128.ibm.com/developerworks/linux/library/l-dbus.html?ca=dgr-lnxw95D-BUS.

         一个外国牛人写的有关DBUS的简介,附有简单的例程,但例程需要稍做修改才能编译通过,修改后的函数signal_filtersend_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;

}

 

2http://hi.baidu.com/zengzhaonong/blog/item/670b98d6e63ae42c07088bae.html

这里的例子给出了DBus上几种消息的发送、接收程序框架,例子很容易看明白,一般在此框架上做些修改即可得到自己需要的代码。

 

3http://blog.csdn.net/fmddlmyy/archive/2008/12/23/3585730.aspx

  这个博客的博主正准备详细深入的介绍DBus的方方面面,博主刚开始讨论DBus不久,博客还在持续更新中,估计博主已经在DBus上已经有深厚的功底,请特别关注 :》

 

4http://blog.chinaunix.net/u1/58649/showart_462468.html

  这里是一个比较全的例子,600多行的程序涉及了DBus的方方面面,有极高的参考价值。

 

5http://blog.csdn.net/cuijpus

          这个博客的博主是做手机开发的,在DBus上也有很深的功底,一些例程很值得学习。

 

6freedesktop.org - Software-dbus.url

          DBus Home,这个是最重要也是最有价值的参考资料,DBus的相关源代码和文档都在这里,另外网站还给出了一些使用DBus的开放源代码项目列表,如果你编写DBus某一方面的代码时遇到困惑,网上又找不到可供参考的例子,到这些open source中去serch相关源代码或许是一个很有效的方法。

阅读(1642) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~