linux C язык. setjmp longjmp будильник - PullRequest
2 голосов
/ 06 мая 2020

выполнить

мой код

jmp_buf a;

void sig_handler(int signum) {
        if(signum == SIGINT) exit(0);

        printf("In the handler\n");
        sleep(2);
        alarm(3);
        longjmp(a,1);
}
int main(int argc, char *argv[]) {
    int j=0;
    struct sigaction sa;

    memset(&sa, 0, sizeof(struct sigaction));
    sa.sa_handler = sig_handler;
    sigfillset(&sa.sa_mask);
    sa.sa_flags = 0;
    sigaction(SIGALRM, &sa, NULL);

    alarm(2);
    j = setjmp(a);
    while(1){
       printf("In the main\n");
       pause();
        }
    return 0;
}

Я думал, что результат этого кода

В основном . В обработчике. В основном. В обработчике. В основном. В обработчике. В основном. В обработчике. . . .

но это не сработало. В обработчике не была установлена ​​функция будильника. когда удаляю setjmp, longjmp, работает хорошо. Но я не хочу их удалять. Влияет ли setjmp на настройку функции будильника? Как решить эту проблему.

1 Ответ

3 голосов
/ 06 мая 2020

Взаимодействие longjmp и сигналов не определено. Вместо этого используйте siglongjmp. Этот код должен работать:

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

sigjmp_buf a;

void sig_handler(int signum) {
        if(signum == SIGINT) exit(0);

        printf("In the handler\n");
        sleep(2);
        alarm(3);
        siglongjmp(a,1);
}

int main(int argc, char *argv[])
{
    int j=0;
    struct sigaction sa;

    memset(&sa, 0, sizeof(struct sigaction));
    sa.sa_handler = sig_handler;
    sigfillset(&sa.sa_mask);
    sa.sa_flags = SA_NODEFER;
    sigaction(SIGALRM, &sa, NULL);

    alarm(2);
    j = sigsetjmp(a, 1);
    while(1){
       printf("In the main\n");
       pause();
        }
    return 0;
}
...