signal是一种软中断信号,提供异步事件处理机制。signal是进程间相互传递信息的一种粗糙方法,使用场景如下:
- 进程终止
- 终端交互
- 编程错误或硬件错误相关,系统遇到不可恢复的错误时触发崩溃机制让程序退出,比如:除0,内存写入错误等。
这里我们主要考虑系统遇到不可恢复的错误即Crash时,信号相关的应用。此类致命signal有很多,简单列举如下:
SIGABRT–程序中止命令中止信号
SIGALRM–程序超时信号
SIGFPE–程序浮点异常信号
SIGILL–程序非法指令信号
SIGHUP–程序终端中止信号
SIGINT–程序键盘中断信号
SIGKILL–程序结束接收中止信号
SIGTERM–程序kill中止信号
SIGSTOP–程序键盘中止信号
SIGSEGV–程序无效内存中止信号
SIGBUS–程序内存字节未对齐中止信号
SIGPIPE–程序Socket发送失败中止信号
signal的捕获可以使用signal函数,将signal抛给处理函数进行处理,通过signal 的name 和线程的callStackSymbols等信息即可定位该signal发生的场景。如下所示:
void SignalHandler(int sig)
{
// See https://stackoverflow.com/questions/40631334/how-to-intercept-exc-bad-instruction-when-unwrapping-nil.
NSString *name = @"Unknown signal";
switch (sig) {
case SIGHUP:{
name = @"SIGHUP";
}
break;
case SIGINT:{
name = @"SIGINT";
}
break;
case SIGQUIT:{
name = @"SIGQUIT";
}
break;
case SIGILL:{
name = @"SIGILL";
}
break;
case SIGTRAP:{
name