1

我被要求为使用 SocketCAN 与汽车上的一组控制单元通信的程序创建一个 dbus 接口(这只是背景信息,与问题无关)。最初的概念是使用一个侦听器接口,该接口为汽车中被询问的每个控制单元生成一个新的“节点”。这将导致com.acme.myservice总线上出现以下对象:

/com/acme/listener
/com/acme/node1
/com/acme/node2
...
/com/acme/nodeN

这个想法是从已经从命令行与单个 ECU 进行通信的 C 程序中接管代码。该代码依赖于 fork()ing 以便循环运行部分通信并出于时间原因并行运行其他部分。

我曾计划使用GDBusObjectManager模型,为侦听器使用新代码,并为每个节点实例重用 fork()ing 代码。不幸的是,我遇到了麻烦,因为我仍然需要处理 DBus 消息并将信息传递给(现在分叉的)孩子,并且不支持:

在 UNIX 上,GLib 主循环与 fork() 不兼容。任何使用主循环的程序都必须从子程序执行 exec() 或 exit() 而不返回到主循环。

我可以重构分叉代码,使其在主循环迭代之间的单个进程中执行,而不是使用 g_main_loop_run,但是如果有大量数据和多个节点正在运行,这可能会导致太多延迟。

解决这个问题的最佳方法是什么?是否有可能使用内置的 glib 机制以某种方式处理这些并行项目,或者有没有办法解决 mainloop/forking 问题?在使用 DBus 的单个进程和执行实际工作的分叉子进程之间使用不同的 IPC 机制是唯一的解决方案吗?(这可能与 gdbus 接口所需的代码一样多,因此它有点多余)

4

0 回答 0