C:在接收信号时停止执行并跳转到程序中的特定点

时间:2016-12-21 06:42:35

标签: c linux unix signals

我编写了一个代码,其中两个独立的程序(比如1和2)通过消息队列进行通信。每个程序都会发送一条特定mtype的消息,并等待特定mtype的响应。基于mtype函数被调用。程序2最初在等待从程序1发起消息链的消息队列上等待select(),并且在每个成功通信链之后通过消息队列返回到select(),等待程序1启动下一个通信链。 / p>

我希望程序2必须返回select(),在程序1发现错误的情况下,从程序1接收特定信号(例如SIGUUSR1)的通信链之间停止执行在当前的链中并希望重置,然后将启动新的通信链。

收到此信号后,程序2将从其所在的所有功能返回并直接跳至select()

我很遗憾没有共享代码片段,但我希望我已经说明了这一点。

...谢谢

1 个答案:

答案 0 :(得分:1)

怎么样:

  • 当程序2启动时,它执行大部分初始化,然后分叉自己的副本。
  • 子进程创建套接字并连接到套接字,然后选择并正常运行。
  • 当子进程收到SIGUSR1时,它将以退出状态退出,表示需要重新启动。
  • 父进程只是等待子进程退出,如果退出状态表明需要重启,则分叉另一个子进程。 (任何其他退出状态都会导致父级以相同的状态退出。)

讨论:

  • 重启速度很慢(需要创建套接字等)。
  • 进程1需要知道消息队列在发送SIGUSR1
  • 时会断开连接
  • 这应该非常可靠,并且可以在Posix上移植。
  • fork位实际上只是一种优化。您可以将父进程设置为某种脚本 - 在这种情况下,模型甚至可以移植到Windows(显然脚本会有所不同,但程序2的源代码可以移植)。

唯一的另一种选择是拥有某种过程2轮询的标志"经常"。如果设置了该标志,则该进程将异常(C ++)或longjmp s(C)返回到select调用。该标志在信号处理程序中设置。

这种方法的问题在于:a)如果发生某些事情阻止你轮询旗帜,它就会中断; b)编写异常安全的代码或者在longjmp通过代码时不会泄漏资源的代码非常困难。