信号---信号的产生

通过我的上篇文章可以了解到信号的基本概念,本篇我们复习总结信号是如何产生,信号的类型和信号如何处理,信号的产生总结起来有三种形式,分别如下:

  • 通过终端按键产生信号;
  • 通过调用系统函数向进程发送信号;
  • 由软件条件产生信号;
  • 硬件异常产生的信号;

一、通过终端按键产生信号

1.我们在前面的信号的基本概念中提到过的ctrl -c产生SINGINT信号、ctrl -\产生SIGQUIT信号、ctrl -z产生了SIGITSP信号,这些都是终端按键产生的信号,一般终端按键信号只能中断前台进程,这个我们前面也学习过,这里不在赘述

2.对于ctrl -\产生的SIGQUIT信号,我们有一点要了解,它的默认处理动作是终止进程并且Core Dump
这里写图片描述

那么接下来第一个问题:

  • 什么是Core Dump?
    当一个进程要异常终止的时候,可以选择把进程的用户空间内存数据全部保存到磁盘上的一个文件中,文件名通常为core,这叫做Core Dump;

  • Core Dump有什么作用,为什么要产生它?
    我们知道一个进程的异常终止通常是因为遇见了一个bug,为了方便让我们知道是bug在那里,以及如何修改,事后我们可以用调试器gdb检查core文件来找出错误原因,这叫做Post_mortem_Debug(事后调试)

  • 默认的情况下是不允许产生core文件的,通过ulimit -a命令可以查看core文件大小为0,所以运行后不会产生这个文件(这里实例结果是程序运行遇到了SIGQFPE信号即进程有除0 的操作)
    这里写图片描述
    因为:core文件可能包含用户的密码等敏感的信息,不安全,同时它也占用资源;

  • 使用ulimit -c 1024(字节数)可以改变shell进程的Resource Limit,并且运行./proc时产生core.编号文件
    这里写图片描述
    通过调试器gdb core.编号文件可以调试,举例的调试信息
    这里写图片描述
    这里写图片描述
    我们可以明显看到错误原因是1/0;

二、调用系统函数向进程发送信号
1.kill函数:一个进程向另一个进程发送信号
这里写图片描述
参数pid是进程号,要让操作系统知道我们要给哪个进程发送信号,当然,这里也可以自己的id;sig表明我们要发送的信号,可以是标号,也可以是宏名;

2.raise函数:自己个自己发送信号
这里写图片描述
参数sig表明要发送的信号

3.abort函数:使当前进程接收到信号而终止
这里写图片描述
该函数有一个对应的信号(6)SIGABRT,该信号可以让进程异常终止,该函数没有参数,没有返回值,因为该函数执行绝对不会失败,和exit函数一样绝对不会失败(重要),和exit函数不同的地方是exit会设置退出码。

三、由软件条件产生信号

1.闹钟超时产生SIGALRM信号
alarm函数
这里写图片描述

  • 调用alarm函数可以设置一个闹钟,也就是告诉内核在secongs秒后给当前进程发SIGALRM信号,该信号的默认动作是终止进程
  • 这个函数的返回值是0或则以前设定的闹钟时间还剩余的秒数
  • 如果second值为0,表示取消以前设定的闹钟
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值