linux C语言.setjmp longjmp报警



执行

我的代码

jmp_buf a;
void sig_handler(int signum) {
if(signum == SIGINT) exit(0);
printf("In the handlern");
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 mainn");
pause();
}
return 0;
}

我以为这个代码的结果是

总的来说。在处理程序中。总的来说。在处理程序中。总的来说。在处理程序中。总的来说。在处理程序中。。。.

但没用。未在处理程序中设置报警功能。当我删除setjmp,longjmp时,它工作得很好。但我不想删除它们。setjmp是否影响报警功能的设置?如何解决这个问题。

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 handlern");
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 mainn");
pause();
}
return 0;
}

最新更新