使用gdbus-codegen连接到系统DBUS信号

VJ-

使用gdbus-codegen生成的管理器代理时,我无法接收系统的DBus信号。但是我能够通过DBus成功调用systemd提供的方法。

我在网上搜索并查看了这些链接,但收效甚微。当gdbus-codegen用于系统化API时,如何执行此操作的示例并不多。

这是我与代码段一起做的。

1)我生成了systemd内省,并使用该XML作为gdbus-codegen的输入。

...剪

<interface name="org.freedesktop.systemd1.Manager">
<signal name="JobRemoved">
<arg type="u"/> <arg type="o"/> <arg type="s"/> <arg type="s"/>
</signal>

...剪

2)编写我的客户端代码,以使用gdbus-codegen生成的C API并创建一个管理器代理。(一切都在系统总线上)。

SystemdManager *systemdProxy = systemd_manager_proxy_new_for_bus_sync(
    G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE,
    "org.freedesktop.systemd1", "/org/freedesktop/systemd1",
    NULL, error);

3)定义一个信号处理程序

static void on_done(GDBusProxy *proxy,
        gchar *sender_name,
        gchar *signal_name,
        GVariant *parameters,
        gpointer user_data)
{
    LOG_ERROR("on_done");
}

4)将信号处理程序连接到JobRemoved信号的代理。

if (g_signal_connect(systemdProxy, "job-removed",
                     G_CALLBACK(on_done), NULL) <= 0 )
{
    LOG_ERROR("Failed to connect to signal job-removed");
}

5)使用代理启动systemd服务。这将返回成功,并且我可以看到单元启动并运行一两秒钟并终止。

ret = systemd_manager_call_start_unit_sync(
    systemdProxy, unit_name, unit_mode, &job_obj,
    NULL, &error);

6)systemd生成JobRemoved信号。dbus-monitor显示它。

signal sender=:1.0 -> dest=(null destination) serial=11931
        path=/org/freedesktop/systemd1;
        interface=org.freedesktop.systemd1.Manager;
        member=JobRemoved
   uint32 7009
   object path "/org/freedesktop/systemd1/job/7009"
   string "mysample.service"
   string "done"

7)我的信号处理程序永远不会被调用。(一切都使用系统总线,没有其他总线)。我曾尝试各种串detailed_signal的第二个参数g_signal_connect(如:JobRemovedjob_removed::job-removed,一些不被接受g_signal_connect)。

任何帮助是极大的赞赏!

VJ-

解决的办法是glib event loop在我的程序中使用。我的程序没有运行GMainLoop,因此无法从中获取任何回调glib这不是一种优雅的方法,但是由于种种原因,我决定生成一个新线程,然后将其阻塞在g_main_loop_run上。这是它的样子。

void *event_loop_thread(void *unused) {
    GMainLoop *loop = g_main_loop_new(NULL, 0);
    g_main_loop_run(loop);
}
int main() {
    // snip
    pthread_create(&thread_id, NULL, event_loop_thread, NULL);
    // do steps 2 to 6, and at step 7 signal handler is called
}

另外,我还必须修复信号处理程序签名以使其与信号兼容,以接收有意义的参数。

static void on_done(SystemdManager *manager,
        guint32 job_id,
        gchar *job_obj,
        gchar *unit_name,
        gchar *status)
{
    LOG_ERROR("on_done");
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在gjs中使用GDBus调用DBus方法,没有输出?

来自分类Dev

Connecting to systemd DBUS signals using gdbus-codegen

来自分类Dev

如何使用gdbus设置IP地址

来自分类Dev

使用QSignalMapper和实例方法将PySide连接到信号

来自分类Dev

使用PySide将信号连接到目录树的插槽

来自分类Dev

gdbus:信号发射后立即释放信号参数是否安全?

来自分类Dev

在运行时使用gdbus的systemd资源控制SetProperties

来自分类Dev

DBUS 调用失败:GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown

来自分类Dev

Qt-如何使用python将功能连接到qml中的信号?使用QQmlApplicationEngine

来自分类Dev

如何使用新语法将自定义信号连接到pyside中的插槽?

来自分类Dev

无法通过Windows 2012上的系统dsn使用ODBC连接连接到SQL Server 2008

来自分类Dev

连接到信号中心

来自分类Dev

异常:使用Tibco Web消息系统连接到TIBCO EMS时出现“找不到名称”

来自分类Dev

无法在我的本地系统中使用NIFI中的PublishKafka连接到kafka

来自分类Dev

使用托管在主机上的phpMyadmin从本地系统连接到MySql数据库

来自分类Dev

如何接收使用dbus作为信号发送的结构?

来自分类Dev

如何使用带有函数指针的新QObject :: connect语法将QSslSocket ::错误信号连接到插槽?

来自分类Dev

如何使用带有函数指针的新QObject :: connect语法将QSslSocket ::错误信号连接到插槽?

来自分类Dev

未启动 gdm:无法获取当前显示配置状态:GDBus.Error:org.freedesktop.DBus.Error.NameHasNoOwner

来自分类Dev

在VirtualBox Debian系统上使用ping命令不会返回任何路由,但我仍然可以连接到网站

来自分类Dev

我无法使用shutdown命令,因为系统“无法连接到总线:没有这样的文件或目录”

来自分类Dev

如何使用 apt 和 gpg 从防火墙后面将 gcc/gpp 6 到 9 连接到 Xenial 系统?

来自分类Dev

如何使用在本地系统上运行的 Spring Boot 应用程序连接到 AWS 上的 DynamoDB?

来自分类Dev

系统尚未使用 systemd 作为初始化系统(PID 1)启动。不能操作。无法连接到总线:主机已关闭

来自分类Dev

使用Eclipse连接到网络

来自分类Dev

使用Robomongo连接到流星

来自分类Dev

使用Spark连接到Cassandra

来自分类Dev

使用参数连接到函数

来自分类Dev

使用soapClient连接到https

Related 相关文章

  1. 1

    在gjs中使用GDBus调用DBus方法,没有输出?

  2. 2

    Connecting to systemd DBUS signals using gdbus-codegen

  3. 3

    如何使用gdbus设置IP地址

  4. 4

    使用QSignalMapper和实例方法将PySide连接到信号

  5. 5

    使用PySide将信号连接到目录树的插槽

  6. 6

    gdbus:信号发射后立即释放信号参数是否安全?

  7. 7

    在运行时使用gdbus的systemd资源控制SetProperties

  8. 8

    DBUS 调用失败:GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown

  9. 9

    Qt-如何使用python将功能连接到qml中的信号?使用QQmlApplicationEngine

  10. 10

    如何使用新语法将自定义信号连接到pyside中的插槽?

  11. 11

    无法通过Windows 2012上的系统dsn使用ODBC连接连接到SQL Server 2008

  12. 12

    连接到信号中心

  13. 13

    异常:使用Tibco Web消息系统连接到TIBCO EMS时出现“找不到名称”

  14. 14

    无法在我的本地系统中使用NIFI中的PublishKafka连接到kafka

  15. 15

    使用托管在主机上的phpMyadmin从本地系统连接到MySql数据库

  16. 16

    如何接收使用dbus作为信号发送的结构?

  17. 17

    如何使用带有函数指针的新QObject :: connect语法将QSslSocket ::错误信号连接到插槽?

  18. 18

    如何使用带有函数指针的新QObject :: connect语法将QSslSocket ::错误信号连接到插槽?

  19. 19

    未启动 gdm:无法获取当前显示配置状态:GDBus.Error:org.freedesktop.DBus.Error.NameHasNoOwner

  20. 20

    在VirtualBox Debian系统上使用ping命令不会返回任何路由,但我仍然可以连接到网站

  21. 21

    我无法使用shutdown命令,因为系统“无法连接到总线:没有这样的文件或目录”

  22. 22

    如何使用 apt 和 gpg 从防火墙后面将 gcc/gpp 6 到 9 连接到 Xenial 系统?

  23. 23

    如何使用在本地系统上运行的 Spring Boot 应用程序连接到 AWS 上的 DynamoDB?

  24. 24

    系统尚未使用 systemd 作为初始化系统(PID 1)启动。不能操作。无法连接到总线:主机已关闭

  25. 25

    使用Eclipse连接到网络

  26. 26

    使用Robomongo连接到流星

  27. 27

    使用Spark连接到Cassandra

  28. 28

    使用参数连接到函数

  29. 29

    使用soapClient连接到https

热门标签

归档