0

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

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

那么为什么感觉如此不对呢?多进程架构是否未在 C++ 中使用,或者是否有库或更好的做事方式。我用谷歌搜索了一下,你唯一找到的是多线程 C++ 或多进程 C。

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

4

2 回答 2

0

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

于 2013-03-11T17:46:04.680 回答
0

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

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

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

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

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

如果您使用 C++,您可能想看看 boost 必须提供的解决方案(请参阅: http: //www.boost.org/doc/libs/1_39_0/libs/serialization/doc/index.html )

再一次 - 如果它只是平面数据结构,你来回传递不要打扰任何那种开销,只需一点一点地将数据向下传输。

于 2013-03-11T18:00:36.417 回答