簡體   English   中英

linux C 藍光。 setjmp longjmp 警報

[英]linux C languang. setjmp longjmp alarm

執行

我的代碼

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;
}

我認為這段代碼的結果是

在主要。 在處理程序中。 在主要。 在處理程序中。 在主要。 在處理程序中。 在主要。 在處理程序中。 . . .

但它沒有用。 處理程序中未設置警報 function。 當我刪除 setjmp、longjmp 時,它運行良好。 但我不想刪除它們。 setjmp 是否影響設置警報 function? 如何解決這個問題。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM