【Linux】信号

我们这里谈的信号,和进程间通信的信号量没有任何关系!!!

信号是什么?

生活中有太多的信号,比如下课铃声,交通红绿灯,等等,这些信号通知给我们一定的信息;在Linux中:信号就是一种通知机制。
Linux中的信号可以通过命令:kill -l 查看。 这里写图片描述
1-31号信号称为普通信号(不可靠信号,非实时信号);34-64称为实时信号(可靠信号);
PCB里有一个整型变量,变量的每个比特位的位置代表了不同的编号,比特位的内容决定是否收到该信号(比如:进程收到5号信号,就把第五个比特位变为1)。

理解“操作系统给一个进程发送了一个信号??”

操作系统有控制进程的权利,就是说操作系统有操作PCB的权利,比如:系统给5号进程发送了一个10号信号;系统现在进程列表中找到5号进程,然后把5号进程中位图字段是10 的比特位有0变为1。这样5号进程收到了10好信号。所以,向进程发信号的本质就是:把进程PCB中信号位图的某个比特位由0变1

进程处理信号的三种方式:
  • 忽略
  • 默认(有部分进程默认方式是终止进程)
  • 自定义

我们经常使用的 “Ctrl-C” 到底是什么?
我相信每个学习linux的人都几乎天天会按Ctrl-C;我们就来研究下他。我们当前运行的程序称为前台进程,(shell只能运行一个前台进程和多个后台进程);Ctrl-C产生的信号只能发给前台进程,用户按下Ctrl-C,键盘产生一个硬件中断;如果CPUC正在执行进程代码,则进程的用户空间暂停执行,CPU从用户态切换为内核态,在内核态中吃力硬件中断,驱动程序将Ctrl-C解释为2号信号SIGINT,记在进程PCB中。

我们写个例子:
这里写图片描述

运行结果:
这里写图片描述
运行过程中按Ctrl-C就会产生SIGINT信号,然后调用handler函数,handler执行完后,进程从内核态转到用户态继续执行代码;

另外:
- Ctrl-:产生SIGQUIT信号(3号)
- Ctrl-z:产生SIGTSTP信号(20号)
硬件异常产生信号时,由硬件检测通知内核,然后内核给进程发送适当信号。例如:当我们运行了一个数除以0的操作时,CPU运算单元就会产生异常,内核解释为SIGFPE信号发给进程,再比如,当访问非法内存时,MMU会产生异常,内核解释为SIGEGV信号发给进程。

Core Dump:

什么是Core Dump?
当一个进程异常终止时,在前一刻它将内存中的有效数据保存到了磁盘里,在进程的同一目录下生成一个core文件,这就叫做Core Dump;
进程异常终止,大多是因为有BUG,比如访问了非法内存导致段错误;所以事后,我们可以调试core文件,找到问题原因。但是Linux系统默认是不允许产生core文件的,原因:如果太多的进程产生core文件,会浪费磁盘空间。我们可用ulimit命令改变这个限制。同时我们可以还可以设置core文件的大小。
这里写图片描述
这时候我们来测试一个例子:
代码如图:
这里写图片描述
运行结果:
这里写图片描述
调试core文件:
这里写图片描述
是不是很方便,值得注意的是,因为要对程序调试,所以在编译的时候要加上 -g 选项。

猜你喜欢

转载自blog.csdn.net/prefect_boy/article/details/80414069