我编写了一个代码,其中两个独立的程序(比如1和2)通过消息队列进行通信。每个程序都会发送一条特定mtype
的消息,并等待特定mtype
的响应。基于mtype
函数被调用。程序2最初在等待从程序1发起消息链的消息队列上等待select()
,并且在每个成功通信链之后通过消息队列返回到select()
,等待程序1启动下一个通信链。 / p>
我希望程序2必须返回select()
,在程序1发现错误的情况下,从程序1接收特定信号(例如SIGUUSR1
)的通信链之间停止执行在当前的链中并希望重置,然后将启动新的通信链。
收到此信号后,程序2将从其所在的所有功能返回并直接跳至select()
。
我很遗憾没有共享代码片段,但我希望我已经说明了这一点。
...谢谢
答案 0 :(得分:1)
怎么样:
SIGUSR1
时,它将以退出状态退出,表示需要重新启动。讨论:
SIGUSR1
fork
位实际上只是一种优化。您可以将父进程设置为某种脚本 - 在这种情况下,模型甚至可以移植到Windows(显然脚本会有所不同,但程序2的源代码可以移植)。唯一的另一种选择是拥有某种过程2轮询的标志"经常"。如果设置了该标志,则该进程将异常(C ++)或longjmp
s(C)返回到select
调用。该标志在信号处理程序中设置。
这种方法的问题在于:a)如果发生某些事情阻止你轮询旗帜,它就会中断; b)编写异常安全的代码或者在longjmp
通过代码时不会泄漏资源的代码非常困难。