cpp-ipc
cpp-ipc copied to clipboard
一个主进程和多个子进程
您好!打扰了。我有一个需求。一个父进程,需要和多个子进程(10个左右)通信,请问怎么利用您这个库,有没有具体例子,恳请指教,谢谢!
收发是怎样的?网状的,还是星形的?每个发送者同时也是接收者吗? 建议先把消息通讯链路画一个简图出来。
谢谢!是星状,父子进程间双向通信,子进程之间不需要通信(在这儿怎么可以提交图片? :))
子进程之间会相互感知到么? 比如广播方式:父进程投递的消息,子进程A消费之后,B仍然会收到这条消息 或者消息队列:父进程投递到队列中,任意一个子进程均可以消费,消费掉了就没了 或者点对点通讯:父进程单独和每一个子进程通讯,每一条通道之间的消息是正交的
谢谢!子进程之间不需要相互感知。是不是我可以采用广播方式和点对点通讯,广播方式下所有进程都可以发送和接收,子进程发现是主进程发给自己的就处理,其他消息忽略?点对点通讯方式下,我为每一个子进程都维护共享内存?您好,除了demo中的例子,还有其他示例么?谢谢!非常感谢!
你可以用多发多收广播方式,自己过滤不需要的消息。 如果消息报文不大的话,建议采用父子点对点,需要用多发多收unicast模式(因为父和子都是既接收也发送,同时会有两个发送和接收者)。不过这样要求子进程个数(或者说目标)确定。
您好,还请教您一个问题,我看了您的demo,请问在chat demo,共享内存是怎么删除的?是第一个启动的进程,还是最后一个退出的进程?谢谢!
在 shm 模块里会使用引用计数进行生命周期管理(针对 linux,win会自动管理),因此正常退出的话,是最后一个退出的进程会自动清理共享内存。
您好,请教一个问题,谢谢!我在类中头文件声明了ipc::channel sender__,但是如果程序运行中我始终没有connect,当我程序退出,程序会报异常退出错误,如果connect了就会正常退出。我的connect是在启动子进程时才connect。如果不想启动子进程,就不会connect.谢谢!
我分别在 ubuntu20.04 + g++9.3.0 和 win10 + vs2019(16.8.4) 下测试了下,没出现你说的这种情况。 请问有简单的能复现的代码么?比如一个 main 加 ipc::channel sender__
谢谢! 我在mainwindow.h 定义了 ipc::channel m_IPCSender; ipc::channel m_IPCReceiver;
在MainWindow.cpp有如下函数 onAddProcess() 在此函数中有如下语句 if(!m_bUseShm) { m_ShmName="shm"+getRandomString(10); m_bUseShm=true; char *s; QByteArray ba = m_ShmName.toLatin1(); s = ba.data(); m_IPCSender.connect(s,ipc::sender); m_IPCReceiver.connect(s,ipc::receiver); } 以为并不是每次都需要启动子进程的所以,如果这一段没有运行,会报如下错误: 15:32:07: 程序异常结束。 15:32:07: The process was ended forcefully.
感觉问题可能出在别的地方。 如果可以打印调试堆栈的话,建议捕捉一下程序崩溃信号,打印下backtrace
好的,谢谢,我再调试一下