[英]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.