异常与信号
进程异常的本质是程序收到操作系统信号
eg:除0让进程收到异常信号,kill掉进程,使得进程崩溃
进程收到异常信号不一定会退出,对出程序异常,捕捉信号,进程可能不退出。
操作系统如何知道除0操作和野指针的?
cpu的寄存器会扫描代码,其中有个状态寄存器。
状态寄存器有个溢出标志位,当除0时,标志位0->1 从硬件角度体现出来
(当进程切换时,下一个进程也会有自己的独立状态数据写入状态寄存器)
硬件上的问题会被操作系统识别到并且发送信号给进程。
野指针访问失败本质上是cpu在使用MMU(内存管理单元)由虚拟地址到物理地址转变失败,相应的寄存器出现变化,操作系统识别到并发送信号到进程。
捕捉异常信号,死循环的现象是进程没退->每次切换到异常这个异常进程的时候->寄存器变化->os发现问题,发送信号->再次捕捉
上面的异常都与硬件的参与,或者对硬件信息的传递,但实际上异常信号也可以是纯软件,如管道问题 SIGPIPE
软件条件
操作系统可以根据软件条件发送信号到进程
alarm函数向进程发送信号,在seconds秒后后发送信号 SIGALM 14号信号
返回值是剩余的时间,或者上一个闹钟的剩余时间
core 和 term
云服务器默认关闭core file,原因是corefile太大了
打进程core目录,进程出异常,os会将进程在内存中运行信息,dump转储到进程当前目录,形成core pid文件:(核心转储)(g++时要有-g选项)