Qt/C++ 系统单元启动/停止时的信号
Qt/C++ signal when systemd unit is started/stopped
我正在使用systemd的dbus接口来启动或停止服务。当我启动或停止一个单元时,我向用户显示一个标签,上面写着"单元 xx 已启动"。我用来用 qdbusxml2cpp 生成的 xml 内省如下所示:
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.freedesktop.systemd1.Unit">
<property name="Id" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Names" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Following" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
</property>
<property name="Requires" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Requisite" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Wants" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="BindsTo" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="PartOf" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="RequiredBy" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="RequisiteOf" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="WantedBy" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="BoundBy" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="ConsistsOf" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Conflicts" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="ConflictedBy" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Before" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="After" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="OnFailure" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Triggers" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="TriggeredBy" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="PropagatesReloadTo" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="ReloadPropagatedFrom" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="JoinsNamespaceOf" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="RequiresMountsFor" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Documentation" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Description" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="LoadState" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="ActiveState" type="s" access="read">
</property>
<property name="SubState" type="s" access="read">
</property>
<property name="FragmentPath" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="SourcePath" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="DropInPaths" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="UnitFileState" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
</property>
<property name="UnitFilePreset" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
</property>
<property name="StateChangeTimestamp" type="t" access="read">
</property>
<property name="StateChangeTimestampMonotonic" type="t" access="read">
</property>
<property name="InactiveExitTimestamp" type="t" access="read">
</property>
<property name="InactiveExitTimestampMonotonic" type="t" access="read">
</property>
<property name="ActiveEnterTimestamp" type="t" access="read">
</property>
<property name="ActiveEnterTimestampMonotonic" type="t" access="read">
</property>
<property name="ActiveExitTimestamp" type="t" access="read">
</property>
<property name="ActiveExitTimestampMonotonic" type="t" access="read">
</property>
<property name="InactiveEnterTimestamp" type="t" access="read">
</property>
<property name="InactiveEnterTimestampMonotonic" type="t" access="read">
</property>
<property name="CanStart" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="CanStop" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="CanReload" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="CanIsolate" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Job" type="(uo)" access="read">
<annotation name="org.qtproject.QtDBus.QtTypeName" value="DBusJob"/>
</property>
<property name="StopWhenUnneeded" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="RefuseManualStart" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="RefuseManualStop" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="AllowIsolate" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="DefaultDependencies" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="OnFailureJobMode" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="IgnoreOnIsolate" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="NeedDaemonReload" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="JobTimeoutUSec" type="t" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="JobTimeoutAction" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="JobTimeoutRebootArgument" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="ConditionResult" type="b" access="read">
</property>
<property name="AssertResult" type="b" access="read">
</property>
<property name="ConditionTimestamp" type="t" access="read">
</property>
<property name="ConditionTimestampMonotonic" type="t" access="read">
</property>
<property name="AssertTimestamp" type="t" access="read">
</property>
<property name="AssertTimestampMonotonic" type="t" access="read">
</property>
<property name="Conditions" type="a(sbbsi)" access="read">
<annotation name="org.qtproject.QtDBus.QtTypeName" value="UnitConditionList"/>
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
</property>
<property name="Asserts" type="a(sbbsi)" access="read">
<annotation name="org.qtproject.QtDBus.QtTypeName" value="UnitConditionList"/>
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
</property>
<property name="LoadError" type="(ss)" access="read">
<annotation name="org.qtproject.QtDBus.QtTypeName" value="UnitLoadError"/>
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Transient" type="b" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="StartLimitInterval" type="t" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="StartLimitBurst" type="u" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="StartLimitAction" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="RebootArgument" type="s" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<method name="Start">
<arg type="s" direction="in"/>
<arg type="o" direction="out"/>
</method>
<method name="Stop">
<arg type="s" direction="in"/>
<arg type="o" direction="out"/>
</method>
<method name="Reload">
<arg type="s" direction="in"/>
<arg type="o" direction="out"/>
</method>
<method name="Restart">
<arg type="s" direction="in"/>
<arg type="o" direction="out"/>
</method>
<method name="TryRestart">
<arg type="s" direction="in"/>
<arg type="o" direction="out"/>
</method>
<method name="ReloadOrRestart">
<arg type="s" direction="in"/>
<arg type="o" direction="out"/>
</method>
<method name="ReloadOrTryRestart">
<arg type="s" direction="in"/>
<arg type="o" direction="out"/>
</method>
<method name="Kill">
<arg type="s" direction="in"/>
<arg type="i" direction="in"/>
</method>
<method name="ResetFailed">
</method>
<method name="SetProperties">
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QVariantMap"/>
<arg type="b" direction="in"/>
<arg type="a(sv)" direction="in">
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QVariantMap"/>
</arg>
</method>
</interface>
</node>
问题是该单元也可以由第三方应用程序启动,这意味着我显示的消息将与 acutal 系统状态不同步。我很困惑为什么在更改运行状态时发出的单元上没有信号,还是我错过了什么?轮询实际状态是没有选择的。
systemd dbus 管理器公开此接口:
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.freedesktop.DBus.Properties">
<method name="Get">
<arg name="interface" direction="in" type="s"/>
<arg name="property" direction="in" type="s"/>
<arg name="value" direction="out" type="v"/>
</method>
<method name="GetAll">
<arg name="interface" direction="in" type="s"/>
<arg name="properties" direction="out" type="a{sv}"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QVariantMap"/>
</method>
<method name="Set">
<arg name="interface" direction="in" type="s"/>
<arg name="property" direction="in" type="s"/>
<arg name="value" direction="in" type="v"/>
</method>
<signal name="PropertiesChanged">
<arg type="s" name="interface"/>
<arg type="a{sv}" name="changed_properties"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="QVariantMap"/>
<arg type="as" name="invalidated_properties"/>
</signal>
</interface>
</node>
相关文章:
- Qt VTK交互风格的信号到小部件
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何创建一个空的全局类并在启动时实例化它
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 线程之间的布尔停止信号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- Qt/C++ 系统单元启动/停止时的信号
- 如何从 c++ 程序启动 zsh/sh/bash 检查信号 SIGTTIN for 命令"cat &"
- Qt 如何获取发送者信号的发送者或如何知道 QWebEngineView 的加载启动网址
- 如何将信号发送到在 KDevelop 中以调试模式启动的程序
- 想要实现将功能类型作为参数的信号模板之类的启动
- 即使程序刚刚启动,是否可以始终捕获信号
- 启动-停止守护进程启动的C程序无法捕获信号
- 用信号通知线程启动特定的函数
- 当将应用程序作为启动的守护程序运行时,C++ 库中的信号 10 (SIGBUS)
- QComboBox Qt Creator信号插槽永远不会启动
- Qt QState机器同步问题:初始状态未在启动信号上设置
- 释放信号量后立即启动的线程
- 当事件循环在错误槽启动时,ContentNotFoundError发生时,QNetworkReply发出两次错误信号