【问题标题】:using signal in c and resuming from specific point in program在c中使用信号并从程序中的特定点恢复
【发布时间】:2015-02-15 15:15:03
【问题描述】:

我正在编写一个程序,我需要在其中捕获 SIGINT 信号,这样我就可以在父进程不退出的情况下杀死子进程。我可以通过发送SIGKILL 来杀死子进程。

但是在处理完一个信号后,主程序会从它停止的地方继续。我希望它从其他地方恢复。例如,假设我有一个循环,并且在循环内的某处捕获了一个信号;在处理完信号后,我希望程序从循环的开头而不是中间继续。

【问题讨论】:

  • 我是你的例子,当你从处理信号中恢复时,你可以使用“继续”并初始化你的循环条件。即 for while (i

标签: c linux signals sigint


【解决方案1】:

异步信号的本质在于它们可以随时中断代码。

如果代码中有不需要此类中断的部分,则禁用这些部分的信号。

在所有其他部分进行相关检查以确定是否发生中断并使代码做出相应反应。

【讨论】:

    【解决方案2】:

    捕获SIGINT 并执行除终止之外的任何操作真的很糟糕。如果您想拦截信号以便杀死孩子,那么您应该执行并退出 - 不要正常继续您的程序。

    在您的信号处理程序中,设置一个全局标志以指示已收到SIGINT,然后在您的循环中测试此变量,并执行条件分支逻辑。

    【讨论】:

    • setjmp() 有什么帮助?
    • 他可以执行longjmp(),而不是从处理程序返回到他的循环上方。这真的是个坏主意——但有时坏主意是完成某事的唯一方法。
    • 我还知道很多常见的程序,它们在收到SIGINT 时会执行其他操作但会终止。
    • 但是离开程序是 OP 似乎并不想要的。
    • 如果我从 signal_handler 跳转,那么下一次它不会接收/捕获信号,因为第一个处理程序还没有返回......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多