C 将GDBus与使用fork()的代码一起使用

C 将GDBus与使用fork()的代码一起使用,c,linux,dbus,gdbus,C,Linux,Dbus,Gdbus,我被要求为一个程序创建一个dbus接口,该程序使用SocketCAN与汽车上的一组控制单元进行通信,这些控制单元只是背景信息,与问题无关。最初的概念是使用一个监听器接口,该接口为汽车中被询问的每个控制单元生成一个新节点。这将导致com.acme.myservice总线上出现类似以下对象的内容: 这个想法是从一个已经通过命令行与单个ECU通信的C程序中接管代码。这段代码依赖于分叉,以便周期性地运行部分通信,并且由于时间原因并行运行其他部分 我计划使用模型,为侦听器使用新代码,并为每个节点实例重用分

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

这个想法是从一个已经通过命令行与单个ECU通信的C程序中接管代码。这段代码依赖于分叉,以便周期性地运行部分通信,并且由于时间原因并行运行其他部分

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

在UNIX上,GLib mainloop与fork不兼容。任何使用mainloop的程序都必须在不返回mainloop的情况下执行或退出子程序

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


最好的解决办法是什么?是否有可能通过内置的glib机制以某种方式处理这些并行项,或者是否有办法解决主循环/分叉问题?在使用DBU的单个进程和执行实际工作的分叉子进程之间使用不同IPC机制的唯一解决方案是什么?这可能是gdbus接口所需的代码,因此它有点冗余

我认为exec是不可接受的。为什么呢?穿线而不是分叉怎么样?这是可行的,还是你真的需要在一个单独的过程中使用它?他们选择fork作为原始项目,因为据推测它不需要太多资源,而且软件在嵌入式设备上运行。该代码甚至还不接近线程安全。我可以自由地更改他们的代码,但这意味着他们项目的每个版本都会有类似的更新,所以我认为谨慎的做法是找出是否有某种方法可以按原样重用代码,如果没有,找出影响最小的方法。那么这些选项是->1个exec还是2个线程?
/com/acme/listener
/com/acme/node1
/com/acme/node2
...
/com/acme/nodeN