gpt4 book ai didi

c - Linux C蓝光。 setjmp longjmp警报

转载 作者:行者123 更新时间:2023-12-03 09:56:01 25 4
gpt4 key购买 nike

execute

my code

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是否会影响警报功能的设置?如何解决这个问题。

最佳答案

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

关于c - Linux C蓝光。 setjmp longjmp警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61628569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com