longjmp(buffer,0)不返回0

时间:2014-10-12 20:21:14

标签: c longjmp setjmp

我尝试使用setjmp / longjmp做一些简单的事情:要求用户多次按Enter键,如果用户插入其他内容,则会使用longjmp重新启动进程。

我使用计数器检查它是否有效,此计数器在启动时为0,但是当使用longjmp时,计数器将重新启动为1.

#include <stdio.h>
#include <setjmp.h>
jmp_buf buffer;
char inputBuffer[512];

void handle_interrupt(int signal) {
    longjmp(buffer, 0);
}

int main(int argc, const char * argv[]) {
    int counter = 0;
    counter = setjmp(buffer); // Save the initial state.

    printf("Counter: %d\n", counter);

    printf("\nWelcome in the jump game, press enter (nothing else!): \n");
    while (fgets(inputBuffer, sizeof(inputBuffer), stdin)) {
        if (*inputBuffer == '\n') { // If user press Enter
            counter++;
            printf("%d\n\n", counter);
            printf("Again: \n");
        } else {
            handle_interrupt(0);
        }
    }
}

输出:

pc3:Assignement 3 ArmandG$ ./tictockforever
Counter: 0

Welcome in the jump game, press enter (nothing else!): 

1

Again: 

2

Again: 
StackOverflow
Counter: 1

Welcome in the jump game, press enter (nothing else!): 

2

Again: 

我知道这段代码很愚蠢,我只是想在一个简单的例子中使用setjmp / longjmp。

2 个答案:

答案 0 :(得分:6)

setjmp仅在第一次直接返回时返回0。

在任何其他情况下,它会返回您传递给longjmp的任何内容,除非您传递0
在这种情况下,它返回1.

答案 1 :(得分:4)

您需要下载C标准的副本(Google for&#34; C11 Draft Standard&#34;例如)并非常仔细地阅读setjmp / longjmp的文档。 setjmp不是像其他人一样的功能。你使用setjmp绝对是非法的。关于使用它的合法方式类似于

if (setjmp (...)) {
    ...
} else {
    ...
}