在C语言中,您可以使用fork()创建多进程应用程序,然后可以使用先进先出管道进行通信。我了解到C++只支持多线程应用程序,如果你想要一个多进程的应用程序,你必须依靠fork()。
但是在C++中,类型检查是至关重要的,所以我不能只通过管道传输对象而没有任何风险。您可以强制转换为void*,并要求sizeof和通过管道发送所有内容,以便将其类型转换回原始对象。
那么为什么这感觉如此不对劲呢?在C++中是否没有使用多进程架构,或者是否有库或更好的处理方法。我用谷歌搜索了一下,你能找到的唯一的东西是多线程C++或多进程C。
想要更多进程的原因是我希望我的应用程序尽可能健壮。如果我的web服务崩溃,我希望我的主进程重新启动它。多线程没有办法做到这一点,因为你永远不会知道一个线程是否损坏了另一个线程的内存,所以如果你在一个线程中遇到错误,你必须出于安全考虑重新启动。
发布于 2013-03-12 01:46:05
我假设你所说的多进程程序是指同时运行两个独立的程序实例,并在它们之间共享一些数据。进程之间的通信可能很棘手。我一直使用你描述的管道类型转换方法,或者通过使用本地套接字系统来回发送数据,但是确实存在用于进程之间更高级别通信的库,请参阅boost.interprocess我会看一看,看看它是否能满足您的需要。
发布于 2013-03-12 02:00:36
就我对您的问题的理解而言,您的主要问题是通过某种串行连接将数据从一个进程传递到另一个进程。
如果是这种情况,并且您只是在行中上下传递平面数据结构,那么使用您已经描述的方法应该不会有问题。只需将整串比特放入行中,并转换为行的另一端的相应类型。只要你只与运行在同一台机器上的进程通信,这些进程的可执行文件是由相同的编译器生成的,并且使用相同的编译器开关,那么字节顺序、成员对齐或其他任何东西都不会有任何问题。
另一方面,如果您的数据更加复杂,包含对其他对象的某种引用、动态长度的列表等,那么您很快就会遇到大麻烦,使用简单的强制转换来作废*并逐位抽取数据。因此,在对象的“序列化”和“反序列化”方面,您肯定需要一种更复杂的方法。
("serialization"和"deserialization")是您可能需要进一步研究的两个术语,以找到最适合您的问题的方法。
正如您很快就会发现的那样,这些问题的“解决方案”被一次又一次地发明出来,像sun、RPC和asp.1使用的XDR这样的标准层出不穷,仅举几例,很难说哪一种最适合您的用例。
如果你打算使用C++,你可能想看看boost提供的解决方案(参见:http://www.boost.org/doc/libs/1_39_0/libs/serialization/doc/index.html)
再说一次--如果只是来回传递的平面数据结构,那么不要为这种类型的开销而烦恼,只需要一点一点地记录数据即可。
https://stackoverflow.com/questions/15344431
复制相似问题