2011-07-23 25 views
2

我使用Perl和Net::DBus模块。我写了一个简单的测试程序:使用Perl开始DBus的会话总线Net :: DBus

#!/usr/bin/perl 
use strict; 
use warnings; 

package MyObj; 
use Net::DBus::Exporter qw(org.example.Tao); 
use base qw(Net::DBus::Object); 

sub new { 
    my $class = shift; 
    my $service = shift; 
    my $self = $class->SUPER::new($service, '/MyObj'); 
    bless $self, $class; 
    return $self; 
} 

dbus_method("Hello", ["string"]); 

sub Hello { 
    return 'Hello'; 
} 

package main; 
use Net::DBus; 
use Net::DBus::Reactor; 

my $bus = Net::DBus->session; 
my $service = $bus->export_service("org.example.Tao"); 
my $object = MyObj->new($service); 
my $reactor = Net::DBus::Reactor->main(); 
$reactor->run(); 

return 0; 

我通过SSH连接和使用:

Perl, v5.8.8 built for x86_64-linux-thread-multi 
Linux example.com 2.6.32.19-0.2.99.17.22250fd-xen #1 SMP 2010-09-13 10:16:50 +0200 x86_64 x86_64 x86_64 GNU/Linux 
CentOS release 5.4 (Final) 

当我尝试启动我的test.pl,我得到的错误:

org.freedesktop.DBus.Error.Spawn.ExecFailed: 
Failed to execute dbus-launch to autolaunch D-Bus session 

这错误由此行提出:

my $bus = Net::DBus->session; 

谷歌向我暗示约​​。我执行了yum install dbus-x11

我试着重新开始我的测试代码,并在同一行中出现错误:

org.freedesktop.DBus.Error.Spawn.ExecFailed: 
dbus-launch failed to autolaunch D-Bus session: 
Autolaunch error: X11 initialization failed. 

阅读说明书后,我检测DBUS会话守护程序未启动,我的环境变量DBUS_SESSION_BUS_ADDRESS是空的:

[[email protected] perl]# ps ax|grep dbus|grep -v grep 
1019 ?  Ss  0:00 dbus-daemon --system 

然后我前高管:

[[email protected] perl]# dbus-launch --sh-syntax 
DBUS_SESSION_BUS_ADDRESS='unix:abstract=/tmp/dbus-smHadq6yxV,guid=101ccd74fb75ae501485ed004e2a9043'; 
export DBUS_SESSION_BUS_ADDRESS; 
DBUS_SESSION_BUS_PID=5037; 
[[email protected] perl]# ps ax|grep dbus|grep -v grep 
1019 ?  Ss  0:00 dbus-daemon --system 
5037 ?  Ss  0:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session 

但DBUS_SESSION_BUS_ADDRESS是相同的空。

问题: 我需要简单的两个Perl应用程序。第一个应用程序注册dbus会话服务。另一个使用我的注册服务的应用在我的环境中做到最好和正确的方法是什么?

+0

你在问三个不同的问题。堆栈溢出不能很好地工作,所以我删除了最后两个。如需其他主题,请[打开新问题](http://stackoverflow.com/questions/ask),如果需要,请参阅[修订](http://stackoverflow.com/posts/6799472/revisions)。 – daxim

+0

感谢您的标题更正,但我使用的是CentOS,而不是Fedora。我回滚修改并删除不重要的问题。 –

回答

2

首先,您需要eval dbus-launch输出。像这样:

$ env | grep DBUS 
(empty output; no DBUS session bus launched yet) 
$ eval `dbus-launch --sh-syntax` 
(empty output; DBUS session bus started, output is evaluated to set shell vars) 
$ env | grep DBUS 
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-ZkMjn6B47b,guid=85b2da814a8a061d4e7a55004e35b499 

其次,你应该考虑你将如何使用你的应用程序。试着回答自己这些问题:你为什么试图绑定到会话总线(根据定义,这是一个总线,与交互式用户会话相关)?如果这是一个系统范围的服务,它应该绑定到系统总线。如果是用户服务,用户会话管理器应负责启动dbus会话总线。