【问题标题】:SIGALRM: continue execution after firedSIGALRM:触发后继续执行
【发布时间】:2014-07-12 16:27:41
【问题描述】:

我正在编写一个循环执行某些指令的代码(在 for 内),但如果当前执行由于某种原因需要很长时间才能完成,我想要中断执行,然后跳到下一个。这是我的代码:

int i =0; //global var
for (i = 0; i < 5; i++) {
        signal(SIGALRM, timeout_function);
        alarm(TIMEOUT);
        if (i == 2) {
            int number;
            scanf("%d", &number);
            //simulate long operation

        } else {
            printf("current cycle: %d\n ", i);
            alarm(0);
        }
    }

timeout_function 只是打印一条消息。 现在这是执行时打印的内容:

current cycle: 0
current cycle: 1
cycle 2 interrupted
cycle 2 interrupted
cycle 2 interrupted
...

所以 for 的执行被阻止。如何在 sigalarm 之后继续正常执行 for?

编辑

TIMEOUT 是启动代码时作为参数传递的值。 超时函数是一个简单的 printf:

void timeout_function() {
    printf("cycle %d interrupted\n", i);

}

【问题讨论】:

标签: c unix signals


【解决方案1】:

直到 i 的值小于 2,使用 alarm(0) 取消所有警报设置
可能的原因是一旦i >= 2的值,程序执行就在等待用户输入number
届时将调用信号处理程序“timeout_function”。 这意味着执行没有被阻塞,但系统正在等待用户输入。

同样在 TIMEOUT 设置为 1 的同一程序之后,我按预期获得了以下结果。

当前周期:0
当前周期:1
超时 i = 2
2 //来自标准输入的用户输入
当前周期:3
当前周期:4

【讨论】:

  • 好的,但是 scanf 仅用于模拟需要大量时间的操作,所以我会跳过它,然后继续下一个循环(其中 i=3)
  • @giozh 你能详细说明一下上面的评论吗,我知道执行 scanf 时需要很多时间是的,它会等到输入输入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2011-04-19
  • 1970-01-01
  • 2021-05-24
  • 2011-12-29
  • 2018-09-19
相关资源
最近更新 更多