2014-07-12 141 views
0

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

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 
... 

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

EDIT

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

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

} 
+0

1个
超时设为i = 2
2 //用户从标准
当前周期输入什么是超时值 –

+0

你在哪里打印'“循环x中断”'?请创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们显示。 –

回答

0

直到i的值是大于2较小,所有的报警设定使用报警(0)
可能的原因是取消,一旦的值i> = 2,程序执行等待用户输入到
然后调用信号处理函数“timeout_function”。 这意味着执行未被阻止,但系统正在等待用户输入。

同样的程序后TIMEOUT设置为1我得到了以下结果如预期。

当前周期:0
当前周期:3
当前周期:4

+0

好吧,但scanf只用于模拟需要很多时间的操作,所以我会跳过它,然后继续下一个循环(我i = 3) – giozh

+0

@giozh你能详细说明上面的评论,我明白了当scanf被执行时,它需要很多时间是的,它会等待直到输入被输入 –