首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Perl Net::DBus启动DBus的会话总线

用Perl Net::DBus启动DBus的会话总线
EN

Stack Overflow用户
提问于 2011-07-23 17:20:46
回答 1查看 2.2K关注 0票数 2

我使用的是Perl和Net::DBus模块。我写了一个简单的测试程序:

代码语言:javascript
复制
#!/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连接并使用:

代码语言:javascript
复制
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时,我得到了错误:

代码语言:javascript
复制
org.freedesktop.DBus.Error.Spawn.ExecFailed:
Failed to execute dbus-launch to autolaunch D-Bus session

此错误由以下代码行引发:

代码语言:javascript
复制
my $bus = Net::DBus->session;

谷歌向我暗示了关于dbus-launch的事情。我处死了yum install dbus-x11

我尝试再次启动我的测试代码,但在同一行中出现错误:

代码语言:javascript
复制
org.freedesktop.DBus.Error.Spawn.ExecFailed: 
dbus-launch failed to autolaunch D-Bus session: 
Autolaunch error: X11 initialization failed.

在阅读手册后,我检测到DBUS会话守护进程没有启动,并且我的ENV var DBUS_SESSION_BUS_ADDRESS为空:

代码语言:javascript
复制
[root@zion perl]# ps ax|grep dbus|grep -v grep
1019 ?        Ss     0:00 dbus-daemon --system

然后我执行:

代码语言:javascript
复制
[root@zion 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;
[root@zion 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会话服务。另一个使用我的注册服务的应用程序。在我的环境中,最好、最正确的方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2011-08-01 04:05:55

首先,您需要启动dbus- eval输出。如下所示:

代码语言:javascript
复制
$ 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会话总线。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6799472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档