hello 大家好,我又回来了,今天想跟大家分享一点有关程序崩溃的一些经验。我们知道C++捕获的异常往往是自己已经定义好的,但是真正的错误层出不穷,往往还没等你捕捉到,程序就已经崩溃了,所以保留有关程序异常的信息就尤为重要。可问题是我怎么知道程序什么时候会崩溃,然后把信息保留呢?这就需要一个工具,就是信号(signal)
我把一些常用的信号及其类型摆在了下面
#define _NSIG 16 //能够使用的信号的数量 #define SIGHUP 1 // 挂起 #define SIGINT 2 // 中断 (DEL) #define SIGQUIT 3 // 退出 (ASCII FS) #define SIGILL 4 // 非法指令 #define SIGTRAP 5 // 跟踪中断 (捕捉的时候没有重置) #define SIGABRT 6 // IOT 指令 #define SIGIOT 6 // 终止使用PDP-11 #define SIGUNUSED 7 // 备用代码 #define SIGFPE 8 // 浮点型异常 #define SIGKILL 9 // kill (不能捕获或忽略) #define SIGUSR1 10 // 用户定义信号 # 1 #define SIGSEGV 11 // 内存段异常 #define SIGUSR2 12 // 用户定义信号 # 2 #define SIGPIPE 13 // 在管道上写操作没有其他的读操作 #define SIGALRM 14 // 警告 #define SIGTERM 15 // kill后获得软件终止信号 #define SIGEMT 7 // 旧式 #define SIGBUS 10 // 旧式 /* POSIX 要求定义下面的信号, 即使它们不被支持. 这里给出这些定义, 但是它们不被支持. */ #define SIGCHLD 17 // 子进程终止或停止 #define SIGCONT 18 // 如果停止则继续 #define SIGSTOP 19 // 停止信号 #define SIGTSTP 20 // 交互式停止信号 #define SIGTTIN 21 // 后台进程试图读 #define SIGTTOU 22 // 后台进程试图写
你们可能会觉得很疑惑,这是用来干嘛的?其实是这样的,因为当程序在运行的时候,比如说数组越界,那么系统就会发送一个SIGEGV的信号来停止程序运行,然后使用void (*signal(int sig, void (*func)(int)))(int)该函数设置一个函数来处理信号,即信号处理程序。其中他和func函数指针指向你定义的函数(实际上就是把函数名作为参数传给他,但是要保证函数的类型要一致即接受一个int类型,不返回任何结果)。这样我们就可以在自己定义的函数中处理想要的结果了,比如说把堆栈信息写在某个文件中。
打字不易,希望能帮助到大家