当前位置: 技术问答>linux和unix
段错误为什么程序会退出?谁让退出的?
来源: 互联网 发布时间:2016-04-16
本文导语: 段错误为什么程序会退出?谁让退出的? 很常见的现象,现在要问问原因,请高手指点。 | 段错误对应的信号是SIGSEGV! 它的默认行为是: "Core Default action is to terminate the process and dum...
段错误为什么程序会退出?谁让退出的?
很常见的现象,现在要问问原因,请高手指点。
很常见的现象,现在要问问原因,请高手指点。
|
段错误对应的信号是SIGSEGV! 它的默认行为是: "Core Default action is to terminate the process and dump core"!
所以,如果你程序中不捕获信号SIGSEGV,那么其默认的处理方式是:中止程序并dump一份程序结束时的状态信息!
当然,你可以在程序中捕获该信号,简单的可以用signal()注册一个SIGSEGV的处理函数,那么这时候当发生SIGSEGV的时候,就会调用你注册的函数了! 而不是前面的默认行为!
对信号的捕获和处理,是在内核中进行的!
所以,如果你程序中不捕获信号SIGSEGV,那么其默认的处理方式是:中止程序并dump一份程序结束时的状态信息!
当然,你可以在程序中捕获该信号,简单的可以用signal()注册一个SIGSEGV的处理函数,那么这时候当发生SIGSEGV的时候,就会调用你注册的函数了! 而不是前面的默认行为!
对信号的捕获和处理,是在内核中进行的!
|
可能是内核让退出的吧,访问不该访问的地方,或者是C语言的编译器
|
段错误其实还是内存问题。。
遇到这个错误的时候系统就好像接到了ctrl +c信号退出
这些都是内核来监听的。
遇到这个错误的时候系统就好像接到了ctrl +c信号退出
这些都是内核来监听的。
|
进程管理是操作系统的事情,所以进程遇到问题时,操作系统会终止进程,并把相关数据保存下来用来分析,这些数据就是core dump file
|
段错误,由内核识别并且通过信号SIGSEGV通知用户进程。
引起信号SIGSEGV的原因有很多。
比较典型的是,访问导致缺页时,将会判断这个访问是否是有效的,如果是有效的则内核负责为进程补上页面;否则内核通过信号SIGSEGV通知用户进程访问出错。
信号机制允许用户进程为某些信号的处理进行个性化定制。如果没有定制,则信号机制按照内核提供的缺省方案进行处理,那就是上面那位同志说的:
引起信号SIGSEGV的原因有很多。
比较典型的是,访问导致缺页时,将会判断这个访问是否是有效的,如果是有效的则内核负责为进程补上页面;否则内核通过信号SIGSEGV通知用户进程访问出错。
信号机制允许用户进程为某些信号的处理进行个性化定制。如果没有定制,则信号机制按照内核提供的缺省方案进行处理,那就是上面那位同志说的:
|
顶下这位仁兄的意见
个人认为正解。
另外一般来说SIGSEGV信号都是程序越界访问地址造成的,或者是内存溢出(其实本质上也是越界访问),基于内存保护机制内核会终止该进程
|
1)访问系统数据区,尤其是往 系统保护的内存地址写数据
2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域
实现这些的应该是os底层的?意思应该是程序没法运行了,比如一个变量,
运行的时候值是变的,如果没有这个变量的内存,自然就退出了,
段错误编译时候没问题,运行才有问题,这个问题好比死的人为什么不能吃饭?
2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域
实现这些的应该是os底层的?意思应该是程序没法运行了,比如一个变量,
运行的时候值是变的,如果没有这个变量的内存,自然就退出了,
段错误编译时候没问题,运行才有问题,这个问题好比死的人为什么不能吃饭?