c语言执行程序后继续执行,处理完信号后,C程序能否继续执行?

Alexey Polon..

6

如果您知道自己在做什么,可以将指令指针设置为在违规指令之后指向右侧.下面是我的x86(32位和64位)示例.不要在家里或真正的产品尝试!

#define _GNU_SOURCE /* Bring REG_XXX names from /usr/include/sys/ucontext.h */

#include

#include

#include

#include

static void sigaction_segv(int signal, siginfo_t *si, void *arg)

{

ucontext_t *ctx = (ucontext_t *)arg;

/* We are on linux x86, the returning IP is stored in RIP (64bit) or EIP (32bit).

In this example, the length of the offending instruction is 6 bytes.

So we skip the offender ! */

#if __WORDSIZE == 64

printf("Caught SIGSEGV, addr %p, RIP 0x%lx\n", si->si_addr, ctx->uc_mcontext.gregs[REG_RIP]);

ctx->uc_mcontext.gregs[REG_RIP] += 6;

#else

printf("Caught SIGSEGV, addr %p, EIP 0x%x\n", si->si_addr, ctx->uc_mcontext.gregs[REG_EIP]);

ctx->uc_mcontext.gregs[REG_EIP] += 6;

#endif

}

int main(void)

{

struct sigaction sa;

memset(&sa, 0, sizeof(sa));

sigemptyset(&sa.sa_mask);

sa.sa_sigaction = sigaction_segv;

sa.sa_flags = SA_SIGINFO;

sigaction(SIGSEGV, &sa, NULL);

/* Generate a seg fault */

*(int *)NULL = 0;

printf("Back to normal execution.\n");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值