SIGNAL异常信号

一、SIG 异常、内存报错

1、SIGABRT

在IOS中未被捕获的Objective-C异常(NSException),导致程序向自身发送了SIGABRT信号而崩溃。

2、SIGSEGV

SIGSEGV是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。表示指针所对应的地址是无效地址,没有物理内存对应该地址。

.invalid memory acdess 不合法的内存访问(内存段错误)

.访问已经释放的内存,无效的内存地址引用信号。(引用指针已被释放或者回收,但是该指针未被置为null,即 野指针。)

.试图对只读映射区域进行写操作

3、SEGV_ACCERR

对映射的对象没有权限,可能是野指针,该对象已经释放,又调用该对象的错误。

4、SEGV_MAPERR

地址没有映射到对象

二、SIGBUS总线错误分类

1、BUS—OBJERR

硬件故障

2、BUS—ADRERR

不存在的物理地址,Linux平台上执行malloc(),如果没有足够的内存空间,linux不是让malloc()失败返回,否则向当前进程分发SIGBUS信号。

3、BUS_ADRALN

未对齐的内存,ARM不支持非对齐的内存访问,要求对齐访问,否则向当前进程发送SIGBUS信号。

SIGBUS和SIGSEGV信号一样,可以正常捕获。SIGBUS的缺省行为是终止当前进程,并产生core dump。

三、SIGBUS和SIGSEGV信号一般区别

1、SIGBUS(Bus error)一位置指针所对应的地址是有效地址,但是总线不能正常使用该指针。通常是未对齐的数据访问所致。

2、SIGSEGV 意味着指针所对应的地址是无效地址,没有物理内存对应该地址。

Linux中的信号处理是通过信号机制实现的。当一个进程接收到一个信号时,它会根据事先定义好的处理方式来处理这个信号信号的处理方式包括终止进程、忽略信号、终止进程并生成core文件、停止进程和继续运行进程等不同的动作。 在Linux中,信号的处理是通过设置信号的处理函数来完成的。当一个信号到达时,内核会调用相应的处理函数来处理这个信号。可以通过系统提供的函数来设置自定义的信号处理函数。 信号的发送可以通过多种方式,包括按键产生、终端按键产生、系统调用产生、软件条件产生和硬件异常产生等。不同的事件会触发不同的信号发送。例如,按下Ctrl+C会发送SIGINT信号,而按下Ctrl+Z会发送SIGTSTP信号。 对于进程来说,接收到信号后,不管正在执行什么代码,都会暂停运行,去处理信号。这种处理方式类似于硬件中断,被称为“软中断”。对于用户来说,由于信号的实现方式,信号的延迟时间非常短,几乎不可察觉。 总而言之,Linux中的信号处理是通过信号机制实现的,程序在接收到信号后会根据事先定义好的处理方式来处理这个信号。这种处理方式可以通过设置信号的处理函数来自定义。信号的发送可以通过多种方式,不同的事件会触发不同的信号发送。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Linux信号signal)](https://blog.csdn.net/weixin_43408582/article/details/115523424)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值