linux - 确保 udiksd 正在运行的最佳方法

标签 linux qt dbus

我正在为 Raspberry Pi 编写一个程序,当用户插入 USB 驱动器时需要收到通知。我正在使用 Qt 的 D-Bus 支持来收听 InterfacesAdded from org.freedesktop.UDisks2 ,在我的 x86 Linux 桌面上运行良好。

这是我的代码,用于将 D-Bus 信号设置到我的类的插槽:

auto bus = QDBusConnection::systemBus();
auto monitor = new UsbMonitor(&app);   // my class

if (!bus.connect("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "InterfacesAdded",
            monitor, SLOT(handleit(QDBusObjectPath, QMap<QString,QVariant>)))) {
    qFatal("FATAL Couldn't connect USB monitor to D-Bus signal");
}

它不适用于 Pi。我发现 udisksd 没有运行,尽管它应该在需要时自动启动。

我猜测是因为我启动到控制台(而不是 GUI)并且只添加了一个信号处理程序,所以这不足以让 D-Bus 自动启动 udisksd。

如果我添加

auto msg = QDBusMessage::createMethodCall("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
bus.call(msg);

在调用 bus.connect 之前,一切正常。

是否有更好的方法来确保 udisksd 正在运行?我宁愿更改 Pi 上的配置文件,也不愿使用额外的代码来“唤醒”服务。

最佳答案

取决于您在 Pi 上运行的发行版。如果您使用的是使用 systemd 的发行版,则可以运行 sudo systemctl enable --now udisks2.service将服务配置为始终启动。

您可能想要扩展代码以观看 org.freedesktop.UDisks2 D-Bus 上的名称,因为当信号消失并重新出现时您可能需要重新连接。 (我不知道 Qt D-Bus 是如何处理这个问题的;它是否在信号处理程序注册时或信号发射时将众所周知的名称解析为唯一名称。)

关于linux - 确保 udiksd 正在运行的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43595885/

相关文章:

c++ - 程序在图形 shell 中的运行速度比在命令 shell 中快

c++ - 可以在linux程序中使用带有msvc的在windows上构建的lib

qt - GLEW 和 Qt5 重新定义标题

qt - 如何制作一些可重用的 QML 对象,它可以注入(inject)另一个 QML 对象?

linux - 谁在Linux系统调用了我的DBus API

c - dbus 总是需要总线吗

linux - Docker-Compose: "Can' 在此目录或任何父目录中找不到合适的配置文件”

c - 如何使用 rsyslogd 登录到/var/log/mail.log?

c++ - 如何在 Qt 中创建静态 QLabel

java - 可用的 d-bus java 实现