计算机中的信号是进程与OS之间进行通信的一种方式。当正在运行的程序发生严重错误时,操作系统将向该进程发送信号,并且该进程可能进一步无法执行。某些进程可能具有信号处理程序,该信号处理程序在进程离开CPU之前会执行一些重要的任务。
信号和中断基本上相同,但是存在很小的区别,即中断是由处理器生成并由内核处理的,而信号是由内核生成并由进程处理的。错误信号通常会导致程序终止,并创建名为core的核心转储文件,该文件在终止时存储进程的状态。可以使用调试器调查此文件,以了解程序终止的原因。
错误信号:
- SIGFPE –
该错误信号表示发生的一些算术错误,例如被零除,浮点错误。如果程序将整数数据存储在某个位置,然后将其用作浮点运算,则会导致“无效运算”异常,因为处理器无法将数据识别为浮点值。但是此信号未指定浮点错误的类型。 - SIGILL –
该信号表示非法指令。当执行垃圾指令或程序没有特权执行的指令时,将生成此信号。 C不会产生非法指令,因此没有机会面对此类错误信号,因为可能的原因可能是目标文件可能已损坏。当堆栈溢出发生时,也会产生此信号。 - SIGSEGV –
当进程尝试访问未分配给它的内存位置时(例如取消引用导致“分段错误”的通配指针),将生成该信号。仅当程序远离其存储空间时才会生成该信号,以便可以由存储保护机制检测到该信号。
该名称是“违反分段”的缩写。 - SIGBUS –
该名称是“ Bus error”的缩写。当访问无效的存储器时也会产生此信号。看起来好像与SIGSEGV相同,但是在SIGSEGV中,引用的内存位置有效,但是在SIGBUS的情况下,引用的内存不存在,即从内存空间中取消引用内存位置。 - SIGABRT –
如果程序本身检测到错误,则使用调用abort()来生成此信号。标准库也使用此信号来报告内部错误。 C++中的assert()函数还使用abort()来生成此信号。 - SIGSYS –
当无效参数传递给系统调用时,将发送此信号以进行处理。 - SIGTRAP –
发生异常时将该信号发送到进程。调试器要求获得通知。例如,如果变量更改其值,则将触发它。
参考–分段错误(SIGSEGV)与总线错误(SIGBUS)
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。