繁体   English   中英

SIGALRM:解雇后继续执行

[英]SIGALRM: continue execution after fired

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

}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM