用sigaction编写自己的信号处理函数

使用sigaction和signalhandler进行调试
文章介绍了如何利用sigaction函数自定义信号处理程序,特别是在调试时如遇到segmentfault,可以通过获取siginfo_t结构体中的si_addr和si_code来定位错误地址和原因。示例代码展示了如何设置SIGSEGV信号的处理函数以打印错误信息。

重写signal handler在debug的时候非常有用,比如发生了segment fault,如果想知道内存访问出错的地址,就可以通过写自己的信号处理函数,打印出错地址。

首先看sigaction函数。通过man sigaction可以看到详细信息。

int sigaction(int signum, const struct sigaction *act,
                     struct sigaction *oldact);

第一个参数是指要处理的信号,第二个参数是sigaction 结构体,包含具体的handler信息,以下:

struct sigaction {
               void     (*sa_handler)(int);
               void     (*sa_sigaction)(int, siginfo_t *, void *);
               sigset_t   sa_mask;
               int        sa_flags;
               void     (*sa_restorer)(void);
           };

第一个和第二个参数都是handle,但是只能同时指定一个。第二个可以得到更多的信息。其他参数可以查看man。我们再重点介绍以下siginfo_t这个结构。

siginfo_t {
               int      si_signo;     /* Signal number */
               
               int      si_code;      /* Signal code */
               
               pid_t    si_pid;       /* Sending process ID */
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值