我编写了一个代码,其中两个独立的程序(比如1和2)通过消息队列进行通信。每个程序发送特定mtype
的消息,并等待特定mtype
的响应。基于mtype
函数调用。程序2最初在消息队列上等待select()
,等待从程序1发起消息链,每次成功后,通过消息队列的通信链返回到select()
,等待程序1发起下一个通信链。
我希望程序2必须返回到select()
,在接收到来自程序1的特定信号(例如SIGUUSR1
)时,它在通信链之间的任何位置停止执行,以防程序1发现当前链中的错误并希望重置,然后将启动一个新的通信链。
在接收到这个信号程序2时,从它在其中的所有函数返回并直接跳转到select()
。
我很遗憾没有分享代码片段,但我希望我已经说明了我的观点。
谢谢..。
发布于 2016-12-20 22:59:39
不如:
SIGUSR1
时,它以退出状态退出,指示需要重新启动。讨论:
SIGUSR1
时将断开连接。fork
位实际上只是一个优化。您可以使父进程成为某种脚本--在这种情况下,模型甚至可以移植到Windows (显然脚本会有所不同,但程序2的源代码将是可移植的)。唯一的另一种选择是设置某种标志,“频繁”地处理2次投票。如果设置了标志,则进程将抛出异常(C++)或longjmp
s (C)返回到select
调用。该标志在信号处理程序中设置。
这种方法的问题是:( a)如果发生了什么事情阻止您轮询标志,它就会中断;( b)很难编写异常安全的代码,或者如果通过longjmp
编写不泄漏资源的代码。
https://stackoverflow.com/questions/41256644
复制相似问题