使用GDBus和使用fork()的代码

时间:2015-03-12 22:59:59

标签: c linux dbus gdbus

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

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

我们的想法是从已经从命令行与单个ECU通信的C程序接管代码。该代码依赖于fork(),以便为了时间原因而循环地运行部分通信和并行运行其他部分。

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

  

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

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

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

0 个答案:

没有答案