系统相关
首页 > 系统相关> > 在linux环境中使用c进行sigaction和忽略信号

在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