确保 udisksd 的最佳方法是 运行

Best way to make sure udisksd is running

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

这是我的代码,用于为我的 class 插槽设置 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 上的配置文件,也不愿为 "wake up" 一项服务编写额外的代码。

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

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