在linux环境中使用c进行sigaction和忽略信号
作者:互联网
我是这类编程的新手,很抱歉,如果我的问题很简单.
我想要做的是在我的程序中导致分段错误而不是退出程序,我想处理信号并在分段错误后继续执行.我编写了一个似乎正常工作的代码,我只是想确保这是实现此目的的方法.所以这是我的代码.
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在评论中.
运行时为此signel删除此处理程序
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-3,linux,sigaction 来源: https://codeday.me/bug/20190829/1760623.html