Linux初识进程信号

打印 上一主题 下一主题

主题 1523|帖子 1523|积分 4569

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
预备

1,你怎么能认识信号呢?

信号是内置的,进程认识信号,是步伐员内置的属性
2,信号产生之后,怎么处置惩罚信号?

知道!由于在信号产生之前,就已经把处置惩罚信号的内容预备好了。
3,处置惩罚信号,是立即处置惩罚吗?

我可能正在做我自己的事情,优先级很高,偶然候信号并不肯定立即处置惩罚,而是在符合的时间。
4,怎么处置惩罚信号?

a,默认举动
b,忽略信号
c,自界说动作
信号产生

1,键盘产生

我们用一个死循环的代码来解说:

这时终端会不断的向屏幕打印内容,直接./运行的步伐属于前台进程,当想在此进程运行时输入诸如ls之类的指令时无法运行:

我们还知道,当我们输入CTRL+c时会退出步伐运行,这时间才气输入命令:

我们输入CTRL + c的动作就是给前台进程发信号让进程停止运行。
这时我们让进程进入后台运行:在./ 后面加上取地址符号:

这时前台进程空出,bash进程可与举行命令行解释:

那么怎么关后台进程?
1,用ps jax | grep + 进程名查进程pid:

用指令:kill -9 +进程id:

2,nohup方法:

用指令:nohup + ./test + &


可以看到,文件夹中多列一个nohup文件,cat此文件时会看到文件内有进程打印到屏幕中的内容.
这时我们看到nohup时下面有个数字1,然后用fg指令加这个1可以把进程拉到前台然后CTRL+C:

可以看到,进程被关闭:
3,常见信号:


可以看到系统提供了这么多种信号,其中1号到31号常用,34-64为时实信号,不做解说.
其中,2号信号就是我们从键盘中输入ctrl +c时给进程发送的信号:
为了测试这个结论,我们要学习一个系统调用接口:signal

此函数可以让我们实现信号捕捉/自界说,signum代表信号,handler代表当此信号触发时运行此函数:
我们可以去man 7手册中检察各自负号代表什么寄义:

其中,ctrl +\ == 三号信号,也是可以停止进程:


这时我们可以用ctrl + \来停止:

那如果,我们将所有信号都包装了那岂不是进程就无法关闭了?
起始在1到31个信号中,有一个信号最为特别,就是九号信号,此信号无法被封装:


我们如安在软件层面明确信号处置惩罚:

键盘把组合键给到os,再有os传给进程,那么如何记录信号?
位图!
比特位为信号的编号,比特位的内容为0/1表示是否受到信号
所以发送信号的本质就是写入信号,os'修改目标进程的pcb中信号位图由0变1;
无论以什么方式发信号,终极都转换到os,让os写入信号,所以进程的唯一管理者是os
我们如安在硬件出卖你明确信号:

os怎么知道键盘上面由数据?
在硬件装备中纯在着一个中心处置惩罚器,平时os都不会对键盘的信息做读取,但是当键盘由内容输入且传输的时间,中心处置惩罚器会吸收到来自键盘的信号,知道有外设的数据已经预备好了,然后再告诉操纵系统从外设中读取数据,这个过程我们叫做停止,
信号为纯软件,模拟信号停止.
有了以上知识的铺垫,我们可以来学习一些代码中的系统调用接口:
kill:

其中,pid指的是须要传入信号的进程pid,sig指的是传几号信号.
raise:给自己传信号:

abort:给自己调用六号信号(kill(getpid(),6);
alarm:可以设置多少秒的闹钟,默认闹钟结束举动为停止进程,给进程发送SIGALRM信号.
alarm(0)为取消闹钟,然后返回闹钟剩余时间.
2,软件条件

在之前的文章中我们知道,alarm可在进程中设置闹钟让进程在肯定时间后收到某信号实验信号内容,这种方式就是属于软件条件产生信号.
所以我们现在知道的五种信号产生方式:
1,键盘
2,指令,
3,系统调用,
4,软件条件
5,异常(下面重点讲)
异常

当系统发现段错误的时间,会给os发送11号信号让进程停止运行
c/c++中常见的异常机就是进程崩了,然后告诉os然后os发信号给进程

那么os怎么知道进程内堕落了?为什么当我们把11号信号自界说之后会出现死循环的情况:
着实我们的步伐错误,都会体现在硬件上:
在cpu中有一个Eflags硬件,其中有一个标志位代表着是否会越界的问题,当此标记为为1时,cpu会返回给os告诉os这个进程堕落了,然后os会给进程发送11号信号,但是在上面代码中,我们把11号信号自界说了,所以步伐还会继承跑,继承跑继承发现错误然后继承防窥如此循环:
当发生除零错误时,cpu中还有一个硬件叫MMU,当除法位数超过MMU标记为时也会返回给操纵系统然后同上(除零错误返回八号信号)


其他问题:

在man 7 手册中会看到有一栏:

term和core代表什么意思?
Trem代表正常退出,不做其他处置惩罚.
core会在当前目次形成一个文件:pid.core,在进程奔溃的时间将进程中部分信息保存下来方便调试,云服务器一般都是默认关闭这个功能,由于一旦堕落可能会无限创建core文件导致磁盘塞满会引发其他问题.
可以用ulimit检察:

可以看到,core部分为0 这时间可以用指令打开:

关闭值为零就行;

这时运行就会产生core文件.
编译时带-g,
gdb+进程名
输入core-file core就可以定位到错误的地方:








免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表