0

这是我的代码:

#include <stdio.h>
#include <setjmp.h>
#include <signal.h>

jmp_buf buf;

void handler(int s);

int main(int argc, char **argv) {
    signal(SIGINT, handler);
    if (setjmp(buf)) {
        printf("back again!\n");
        return 0;
    } else {
        printf("first here.\n");
    }

    for (;;) {}
}

void handler(int s) {
    longjmp(buf, 1);
}

我在 Windows 8 64 位的 VS 2012 下编译它。每次我按 Control+C 时,程序都不会按预期重新启动,而是停止工作。有人可以帮助我吗?

4

2 回答 2

2

从当前的 C 标准:

如果信号的出现不是调用 abort 或 raise 函数的结果,则如果信号处理程序引用具有静态或线程存储持续时间的任何对象,该对象不是无锁原子对象,而不是通过赋值,则行为未定义到声明为 volatile sig_atomic_t 的对象,或信号处理程序调用标准库中除 abort 函数、_Exit 函数、quick_exit 函数或第一个参数等于信号对应的信号编号的信号函数之外的任何函数这导致了处理程序的调用。

您正在使用一个不在允许类型列表中的具有静态存储持续时间的对象 ( buf),并且您使用了一个不在允许函数列表中的标准库函数 ( longjmp)。

于 2013-07-25T16:49:57.707 回答
0

我想你想要的是这个。

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

static int k;

void
handler(int s)
{
    k++;
}

int
main(int argc, char *argv[])
{
    int n = 0;

    signal(SIGINT, handler);

    while (1) {
        if (k > n) { 
            printf("handler got called %d\n", k);
            n = k;
            if (k == 5) {
                break; /* break out after five control-c */
            }
        }
    }

    exit(0);
}

试试看,让我知道它是怎么回事。

于 2013-07-25T19:19:31.787 回答