[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原因中的一种而已,其实上面列表中的这些信号以及它们产生的典型原因都是需要们要熟悉和了解的,否则我们很可能在遇到这些问题时束手无措。
相关文章
- SQL Server导出表结构和数据(sql导出表结构和表数据)
- 告别单证积压!一套系统打破信息孤岛,电子化存证一键溯源!
- 速看!SQL server数据库日志文件过大怎么办?
- 云计算实战:数据备份(如何实现数据云备份)
- SQLServer收缩日志文件(sqlserver收缩日志文件是什么意思)
- RDS sql server使用DTS进行数据库迁移,同阿里云RDS进行数据库迁移
- 如何轻松搞定SAP HANA数据库备份?
- 对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 超详细的SqlServer数据库触发器总结
- Acronis Backup (Advanced)使用示例:备份与恢复(一)