【问题标题】:Is it possible to use glib event loops for IPC?是否可以为 IPC 使用 glib 事件循环?
【发布时间】:2010-06-30 10:56:15
【问题描述】:

是否可以在一个父-多子进程模型中为 IPC 使用 glib 事件循环和 glib io 通道?

父母和孩子必须能够互相发送“命令”。

你能给我一些教程或例子吗?

【问题讨论】:

    标签: ipc glib


    【解决方案1】:

    是的。但它本身并不包含完整的 IPC 解决方案,并且可能无法与现有的每个 IPC 实现完美兼容。对于父母和孩子,我猜你的意思是服务器和客户端?通常,您打开某种网络连接或创建通信管道并获得文件描述符(即使您使用隐藏它的高级库)。您可以将此文件描述符传递给 glib 并获取回调,然后数据可供读取(或连接关闭)。一些流行的 IPC 方法,如 CORBADBUS 已经具有 glib 集成,因此您甚至不需要担心文件描述符等。 glib 事件循环描述为here。与直接使用 poll() 相比,它可能看起来非常复杂,但另一方面它非常便携。

    基本用法是使用 g_source_new() 创建源并使用 g_source_attach() 将其添加到主上下文中,然后使用 g_source_add_poll() 将文件描述符添加到源中。

    如果您还没有决定使用 glib,您可能想查看 libevent 与 glib 做同样的事情,但(恕我直言)更容易使用。它在同时处理 1000 多个客户端方面也明显更好(至少在 Linux 中,其他操作系统甚至可能不支持)。但另一方面,它的便携性不高,可能只能在相当兼容 posix 的系统上运行。

    【讨论】:

    • 不,不是服务器和客户端。我有父(主)进程和大约 10 个孩子。我希望孩子们听父母的命令(例如 die()、reload_config()、do_this()、do_that())和父母听孩子的命令(例如 i_have_finished())。我不需要 1000 个并发客户端,只需要大约 10 个。而且命令很少见。
    • 如果子进程是由主进程启动的本地进程,那么这是一个简单的任务,仅 glib 就可以解决(如果子进程是远程的,您需要自己设置,否则差别不大)。您可以使用 g_spawn_async_with_pipes() 来启动子进程并获取文件描述符(按上述说明使用)。您还可以获得一个 PID,它可用于获取回调,然后子进程以 g_child_watch_add() 终止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多