多进程C ++ fifo

时间:2013-03-11 17:08:38

标签: c++ ipc pipe fifo

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

但是在C ++中,类型检查是至关重要的,所以我不能只通过管道管道对象而没有任何风险。您可以强制转换为void*并询问sizeof并通过管道发送所有内容以将其强制转换回原始对象。

那么为什么这么错呢?多进程体系结构是不是在C ++中使用,还是有库或更好的处理方式。我用Google搜索了一下,你发现的唯一的东西是多线程C ++或多进程C。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

据我所知,你的主要问题是通过某种串行连接将数据从一个进程传递到另一个进程。

如果是这种情况,并且您只是在线上传递平面数据结构,那么使用您已经描述的方法应该没有问题。只需向下射出整行线,然后转换到线路另一端的相应类型。只要您只与同一台机器上运行的进程通信,并使用相同的编译器和相同的编译器开关生成可执行文件,就不会出现字节顺序,成员对齐等问题。

另一方面,如果您的数据更复杂,包含对动态长度等其他对象列表的某种引用,那么您很快就会遇到使用简单转换为void *并将数据泵入的麻烦。比特策略。所以你肯定需要在对象的“序列化”和“反序列化”方面采用更复杂的方法。

这些(“序列化”“反序列化”)是您可能希望进一步调查的两个术语,以找到最适合您问题的方法。

正如您很快就会发现这些问题是“解决方案”一次又一次地被发明的问题,例如Sun RPC和ASN.1使用的XDR这样的标准动物园,仅举几例,很难说告诉哪一个最适合您的用例。

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

再一次 - 如果它只是扁平的数据结构,你来回传递不会打扰任何类似的开销,只是一点一点地向下射击数据。