multi-process C++ fifo

multi-process C++ fifo

本文关键字:fifo C++ multi-process      更新时间:2023-10-16

在C中,您可以使用fork()创建多进程应用程序,然后可以使用FIFO管道进行通信。我了解到c++只支持多线程应用程序,如果你想要一个多进程应用程序,你必须依赖fork()

但是在c++中,类型检查是至关重要的,所以我不能毫无风险地通过管道来管道对象。您可以强制转换为void*,并请求sizeof,然后通过管道发送所有内容,将其类型转换回原始对象。

为什么感觉这么不对?c++中是否没有使用多进程架构,或者是否有库或更好的处理方法。我谷歌了一下,你唯一能找到的是多线程c++或多进程C。

需要更多进程的原因是我希望我的应用程序尽可能健壮。如果我的web服务崩溃,我希望我的主进程重新启动它。没有办法做这个多线程,因为你永远不知道如果一个线程没有损坏内存在另一个线程,所以如果你在一个线程中得到一个错误,你必须重新启动安全。

我认为你所说的多进程程序是指同时运行一个程序的两个独立实例,它们之间有一些共享数据。进程之间的通信可能很棘手。我一直使用您描述的管道类型转换方法,或者使用本地套接字系统来回发送数据,但是确实存在用于进程之间更高级别通信的库,请参阅boost.interprocess我会给它看一看,看看它是否能满足您的需求。

就我对你问题的理解而言,你的主要问题是通过某种串行连接将数据从一个进程传递到另一个进程。

如果是这种情况,并且您只是将平面数据结构上下传递,那么使用您已经描述的方法应该没有问题。只是把所有的比特都输入到行中,然后转换到行另一端的相应类型。只要你只与运行在同一台机器上的进程通信,使用由相同编译器和相同编译器开关生成的可执行文件,就不会有字节顺序,成员对齐或其他任何问题。

另一方面,如果你的数据更复杂,包含对其他对象的某种引用,动态长度列表或类似的东西,那么你很快就会遇到大麻烦,使用简单的强制转换来void*和逐位抽取数据策略。因此,在对象的"序列化"answers"反序列化"方面,您肯定需要一种更复杂的方法。

这两个术语("序列化""反序列化")是您可能想要进一步研究的两个术语,以找到最适合您问题的方法。

您很快就会发现,这些问题的"解决方案"一遍又一遍地被发明出来,诸如sun RPC使用的XDR和ASN.1等标准,仅举几例,很难判断哪一个最适合您的用例。

如果你打算使用c++,你可能想看看boost提供的解决方案(参见:http://www.boost.org/doc/libs/1_39_0/libs/serialization/doc/index.html)

再次强调,如果只是平面数据结构,你可以来回传递,那就不用担心这种开销,只要一点一点地将数据发送到行中即可。