目录:
1.引入
2.介绍系统支持的信号列表
3.键盘方式产生信号
4.程序中存在异常问题,产生信号
5.系统调用产生信号
6.软件条件也能产生信号
7.任何理解OS给进程发送信号
1.引入
我怎么证明ctrl+c是向指定进程发送了2号信号呢??
signal 函数作用是修改指定的一个信号
2.介绍系统支持的信号列表
kill -l 查看系统所支持的信号列表
-------------------------------------------------------------------------------------------------------------------------------
3.键盘方式产生信号
信号的产生方式其中有一种就是通过键盘产生
那么应该怎么终止后台进程呢??
总结一般而言:进程收到信号的处理方案有3中情况
1.默认动作 ---- 一部分是终止自己,暂停等
2.忽略动作 ----- 是一种信号处理的方式,只不过动作就是什么也不干
3.自定义动作(信号的捕捉) ---- 我们刚用我们signal方法,就是在修改信号的处理动作:默认 --》 自定义动作
------------------------------------------------------------------------------------------------------------------------------
4.程序中存在异常问题,导致我们收到信号退出
我们来做几个实验
既然进程已经崩溃了,进程为什么会崩溃呢??
可是我们怎么证明我的程序崩溃是因为收到了11号信号呢??
-------------------------------------------------------------------------------------------------------------------------------
在win or linux下进程崩溃的本质,是进程收到了对应的信号,然后进程执行信号的默认处理动作(杀死进程)
--------------------------------------------------------------------------------------------------------------------------
为什么我的进程会收到信号呢????
-----------------------------------------------------------------------------------------------------------------------------
当进程崩溃的时候,你最想知道上面?????崩溃的原因 waitpid 中是status
当一个进程正常退出时,status次低八位,代表的是进程退出时的退出码,后低7位表示的是进程收到的信号
也就是说崩溃的原因我们是可以通过status来得到的
你还想知道什么???在哪一行崩溃的!!!我得去解决啊
为什么在我的计算机上没有见到 core dump这一项技术呢??原因是因为 默认在云服务器上,core dump这一项技术是被关掉的
所以呢,相当于我的进程出现崩溃的情况,我们可以尝试着把我们的core dump这个选项打开,直接看崩溃的位置
怎么证明并不一定所有的信号都会形成 core dump文件
所以不一定所有的信号都会形成core dump,但是只要你是信号终止的,status都会被设置
但是你有没有core dump文件是由core这个标志位决定!!!
-----------------------------------------------------------------------------------------------------------------------------
可是我该证明验证我有没有core dump文件是由 core这个标志位决定的呢??
可是我想看的是core dump flag 标志位
5.系统调用产生信号
kill 系统调用接口产生信号
此时我们就通过系统调用kill 产生信号!!!
kill是我要发信号给别人发
raise是我给自己发
abort 是给自己发送6号信号(给自己发送一个确定的信号)
--------------------------------------------------------------------------------------------------------------------------------
6.软件条件也能产生信号
调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发送SIGALRM信号,该信号的默认处理动作是终止当前进程
这个函数的返回值是0(说明alarm是准点给当前进程发送信号的),要是没有准点发则返回值是设定闹钟时间还剩下的秒数
我们来证明一下我们alarm的返回值
-------------------------------------------------------------------------------------------------------------------------------
7.任何理解OS给进程发送信号
我们目前理解的就是:
OS给进程发送信号 ---》 OS 发送信号数据给task_struct
如何理解OS给进程发送进程信号 --》 发送信号数据给 task_struct --》 本质是OS向指定进程的task_struct 中的信号位图写入比特位1,即完成信号的发送 --》信号的写入