免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1172 | 回复: 0
打印 上一主题 下一主题

D-BUS编程二三事(转) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-09 14:23 |只看该作者 |倒序浏览
DBUS编程二三事
我本打算先对零八年做一番回顾,然后再写这篇关于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:
[color="#800080"]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)
[color="#800080"]http://hi.baidu.com/zengzhaonong/blog/item/670b98d6e63ae42c07088bae.html

这里的例子给出了DBus上几种消息的发送、接收程序框架,例子很容易看明白,一般在此框架上做些修改即可得到自己需要的代码。
  
(3)
[color="#800080"]http://blog.csdn.net/fmddlmyy/archive/2008/12/23/3585730.aspx

  这个博客的博主正准备详细深入的介绍DBus的方方面面,博主刚开始讨论DBus不久,博客还在持续更新中,估计博主已经在DBus上已经有深厚的功底,请特别关注 :》
  
(4)
[color="#800080"]http://blog.chinaunix.net/u1/58649/showart_462468.html

  这里是一个比较全的例子,600多行的程序涉及了DBus的方方面面,有极高的参考价值。
  
(5)
[color="#0000ff"]http://blog.csdn.net/cuijpus

          这个博客的博主是做手机开发的,在DBus上也有很深的功底,一些例程很值得学习。
  
(6)freedesktop.org - Software-dbus.url
          DBus Home,这个是最重要也是最有价值的参考资料,DBus的相关源代码和文档都在这里,另外网站还给出了一些使用DBus的开放源代码项目列表,如果你编写DBus某一方面的代码时遇到困惑,网上又找不到可供参考的例子,到这些open source中去serch相关源代码或许是一个很有效的方法。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/96294/showart_2048982.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP