multi-process C++ fifo
multi-process C++ fifo
在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)
再次强调,如果只是平面数据结构,你可以来回传递,那就不用担心这种开销,只要一点一点地将数据发送到行中即可。
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- RAII 等效于 FIFO 发布订单
- 使用堆的优先级队列,具有相同键的值不遵循 FIFO(先进先出)
- 相当于Linux fifo的Windows
- 使用信号处理程序处理从 FIFO 接收的数据
- FIFO块程序,直到其他进程读取
- 对 FIFO 的轮询立即在 HP-UX 中返回
- 如何重新启用由另一端关闭的 istream FIFO
- 如何通过fifo使用protobuf的SerializeToOstream和ParseFromIstream进行IPC?
- 如何将 boost::beast 中的序列化数据转换为字符串,以便我可以以 FIFO 方式处理它?
- C 节点类,链接列表,LIFO,FIFO
- 用管道在C++中创建调度队列/线程处理程序:FIFO溢出
- C++优先级队列不遵循 FIFO 顺序
- 是否有任何对象可以用作FIFO和弹出数据的事件
- 阅读FIFO:为什么会阻止然后进行非阻滞
- X&0 Game IPC FIFO 窗口
- Qt的事件循环是FIFO吗?
- 检查文件是否是C++中的命名管道 (fifo)
- 在无锁FIFO缓冲区中删除了节点检测