dbus

≯℡__Kan透↙ 提交于 2019-12-06 07:18:28

D-Bus 也是一个用于进程间通信的框架。

简单介绍一下如何编写一个helloworld通信例子。

0. 下载源码

http://www.freedesktop.org/wiki/Software/dbus#Download.

1. ./configure

这时候可能会出现问题:

configure: error: Could not find expat.h, check config.log for failed attempts

可以通过

sudo apt-get install libexpat1-dev

来解决

2. make

3. make install

其中可能遇到的编译问题

1.  fatal error: dbus/dbus.h: No such file or directory

    把/usr/local/include/dbus-1.0/dbus/拷贝到/usr/include/dbus

2. fatal error: dbus/dbus-arch-deps.h: No such file or directory

  /usr/local/lib/dbus-1.0/include/dbus/dbus-arch-deps.h拷贝到/usr/include/dbus

3. 链接错误 collect2: ld returned 1 exit status

 添加链接选项 -l dbus-1

测试代码

d-bus服务端接收消息

  1. /* server.c */  
  2.    
  3. #include <dbus/dbus.h>  
  4. #include <stdbool.h>  
  5. #include <unistd.h>  
  6. #include <stdio.h>  
  7. #include <stdlib.h>  
  8.    
  9. static DBusHandlerResult  
  10. filter_func(DBusConnection *connection, DBusMessage *message, void *usr_data)  
  11. {  
  12.     dbus_bool_t handled = false;  
  13.     char *word = NULL;  
  14.     DBusError dberr;  
  15.    
  16.     if (dbus_message_is_signal(message, "client.signal.Type""Test")) {  
  17.         dbus_error_init(&dberr);  
  18.         dbus_message_get_args(message, &dberr, DBUS_TYPE_STRING,  
  19.             &word, DBUS_TYPE_INVALID);  
  20.         if (dbus_error_is_set(&dberr)) {  
  21.             dbus_error_free(&dberr);  
  22.         } else {  
  23.             printf("receive message %s\n", word);  
  24.             handled = true;  
  25.         }  
  26.     }  
  27.     return (handled ? DBUS_HANDLER_RESULT_HANDLED : DBUS_HANDLER_RESULT_NOT_YET_HANDLED);  
  28. }  
  29.    
  30. int main(int argc, char *argv[])  
  31. {  
  32.     DBusError dberr;  
  33.     DBusConnection *dbconn;  
  34.    
  35.     dbus_error_init(&dberr);  
  36.    
  37.     dbconn = dbus_bus_get(DBUS_BUS_SESSION, &dberr);  
  38.     if (dbus_error_is_set(&dberr)) {  
  39.         dbus_error_free(&dberr);  
  40.         return -1;  
  41.     }  
  42.    
  43.     if (!dbus_connection_add_filter(dbconn, filter_func, NULL, NULL)) {  
  44.         return -1;  
  45.     }  
  46.    
  47.     dbus_bus_add_match(dbconn, "type='signal',interface='client.signal.Type'", &dberr);  
  48.     if (dbus_error_is_set(&dberr)) {  
  49.         dbus_error_free(&dberr);  
  50.         return -1;  
  51.     }  
  52.    
  53.     while(dbus_connection_read_write_dispatch(dbconn, -1)) {  
  54.         /* loop */  
  55.     }  
  56.     return 0;  
  57. }  

客户端发送消息

  1. #include <dbus/dbus.h>  
  2. #include <stdbool.h>  
  3. #include <unistd.h>  
  4. #include <stdio.h>  
  5. #include <stdlib.h>  
  6.    
  7. int db_send(DBusConnection *dbconn)  
  8. {  
  9.     DBusMessage *dbmsg;  
  10.     char *word;  
  11.     int i;  
  12.    
  13.     dbmsg = dbus_message_new_signal("/client/signal/Object"// object name of the signal  
  14.                                   "client.signal.Type",      // interface name of the signal  
  15.                                   "Test");                   // name of the signal  
  16.     if (!dbmsg) {  
  17.         return -1;  
  18.     }  
  19.    
  20.     word = "hello world";  
  21.     if (!dbus_message_append_args(dbmsg, DBUS_TYPE_STRING, &word, DBUS_TYPE_INVALID)) {  
  22.         return -1;  
  23.     }  
  24.    
  25.     if (!dbus_connection_send(dbconn, dbmsg, NULL)) {  
  26.         return -1;  
  27.     }  
  28.     dbus_connection_flush(dbconn);  
  29.     printf("send message %s\n", word);  
  30.    
  31.     dbus_message_unref(dbmsg);  
  32.     return 0;  
  33. }  
  34.    
  35. int main(int argc, char *argv[])  
  36. {  
  37.     DBusError dberr;  
  38.     DBusConnection *dbconn;  
  39.     int i;  
  40.    
  41.     dbus_error_init(&dberr);  
  42.    
  43.     dbconn = dbus_bus_get(DBUS_BUS_SESSION, &dberr);  
  44.     if (dbus_error_is_set(&dberr)) {  
  45.         return -1;  
  46.     }  
  47.    
  48.     db_send(dbconn);  
  49.    
  50.     dbus_connection_unref(dbconn);  
  51.    
  52.     return 0;  
  53. }  

测试结果如下
root@ubuntu:~/dbus# gcc -o client client.c -l dbus-1
root@ubuntu:~/dbus# gcc -o server server.c -l dbus-1
 
root@ubuntu:~/dbus# ./listen
receive message hello world
 
root@ubuntu:~/dbus# ./send
send message hello world
 
很多API和具体实现还没搞清楚,有待深入研究。
D-Bus的性能会比linux自带的send,recv高么?
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!