SIGALRM:解雇后继续执行

时间:2014-07-12 16:27:41

标签: c unix signals

我正在编写一个循环执行某些指令的代码(在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);

}

1 个答案:

答案 0 :(得分:0)

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

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

  

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