[Linux C/C++]Linux上导致程序异常(Crash)的典型信号及原因
在Linux操作系统上,程序异常(crash)或死机都是由于进程收到了信号(signal)引起的,如SIGABRT、SIGSEGV和SIGBUS等,典型的都是由于程序运行出错造成的,这些信号都会杀死当前的进程。
信号(Signal)是操作系统对进程的一种事件通知机制,信号只有3个来源:
- Linux内核(Kernel)
- 其他进程
- 进程本身
导致进程异常的典型信号及常见原因
从本质上来说,进程Crash都是由于进程收到了内核(Kernel)发送的信号(signal)引起的,在Linux操作系统,没有其他原因。对于通过kill(), sigqueue()等系统调用发送的信号,也要进入内核并最终由内核递达给进程。
对于进程来说,除了可预期的信号,很多时候信号的产生都是因为程序运行出错造成的,如程序试图访问不允许访问的内存造成的,比如空指针,非法指针等。一般来说,当程序发生异常的时候,操作系统就会通过发送信号来杀死这个异常的进程,因为此时操作系统已经别无选择。根据异常的情况不同,Kernel可能发送的信号会有不同。
对于大家比较熟悉段错误(Segmentation Fault),正是由于信号SIGSEGV导致的,它只是我们可能经常会遇到的引起程序Crash原因中的一种而已,其实上面列表中的这些信号以及它们产生的典型原因都是需要们要熟悉和了解的,否则我们很可能在遇到这些问题时束手无措。
相关文章
- Java官方宣布:32位系统用户,你们被抛弃了!
- Java二十周年特别策划--谈谈我与Java的那些年、这些事
- Java二十周年特别策划——谈谈我与Java的那些年、这些事
- Java 25 在 JEP 519 中集成了紧凑对象头
- Java动态代理
- JAVA入门教程-第1章 概述
- 那些让你望而却步的Java概念,其实没那么难!
- CBN x ASEAN Watch丨Labubu-mania: The unlikely cultural sensation sweeping Southeast Asia
- CBN Correspondent丨Coffee shirt, methanol bus, 100% green power…Boao goes all-in on zero-carbon push
- CBN丨Policy supports to shore up foreign investors' confidence