gpt4 book ai didi

c - sigaction 并在 linux 环境中忽略带有 c 的信号

转载 作者:可可西里 更新时间:2023-11-01 11:48:47 26 4
gpt4 key购买 nike

我是这类编程的新手,如果我的问题很琐碎,我深表歉意。我想做的是在我的程序中引起段错误,而不是退出程序,我想处理信号并在段错误后继续执行。我写了一个似乎有效的代码,我只是想确保这是执行此操作的方法。所以这是我的代码。

void myhandle(int mysignal, siginfo_t *si, void* arg)
{
printf("Signal is %d\n",mysignal);

ucontext_t *context = (ucontext_t *)arg;
context->uc_mcontext.gregs[REG_RIP]++;
}


int main(int argc, char *argv[])
{
struct sigaction action;

action.sa_handler=myhandle;
sigaction(11,&action,NULL);

printf("Before segfault\n");

int *a=NULL;
int b=*a;

printf("I am still alive\n");

return 0;
}

有人可以向我解释为什么 myhandle 中的 printf 运行两次吗?这段代码也可以吗?

谢谢。

最佳答案

通过 this example我已经按照以下方式修改了您的代码,现在它可以按您的要求工作。

#include<stdio.h>
#define __USE_GNU
#include<signal.h>
#include<ucontext.h>

void myhandle(int mysignal, siginfo_t *si, void* arg)
{
printf("Signal is %d\n",mysignal);

ucontext_t *context = (ucontext_t *)arg;
context->uc_mcontext.gregs[REG_RIP] = context->uc_mcontext.gregs[REG_RIP] + 0x04 ;
}


int main(int argc, char *argv[])
{

struct sigaction action;
action.sa_sigaction = &myhandle;
action.sa_flags = SA_SIGINFO;

sigaction(11,&action,NULL);


printf("Before segfault\n");

int *a=NULL;
int b;
b =*a;

printf("I am still alive\n");

return 0;
}

输出:

jeegar@jeegar:~/stackoverflow$ gcc test1.c
jeegar@jeegar:~/stackoverflow$ ./a.out
Before segfault
Signal is 11
I am still alive

关于在评论中形成 OP 的进一步问题。要在运行时删除此信号的此处理程序

void myhandle(int mysignal, siginfo_t *si, void* arg)
{
printf("Signal is %d\n",mysignal);

if(flag == 0) {
// Disable the handler
action.sa_sigaction = SIG_DFL;
sigaction(11,&action,NULL);
}

if(flag) {
ucontext_t *context = (ucontext_t *)arg;
context->uc_mcontext.gregs[REG_RIP] = context- >uc_mcontext.gregs[REG_RIP] + 0x04 ;
}

}

关于c - sigaction 并在 linux 环境中忽略带有 c 的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34985539/

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