Linux信号的产生和处理

目录

一、信号

     ◎ 基本概念

     ◎ 简单分类

二、信号的产生

     ◎ 通过终端按键产生信号

     ◎ 调用系统函数向进程发信号

     ◎ 由软件条件产生信号

三、信号的处理动作

      ◎ 忽略此信号

      ◎ 执行该信号的默认处理信号

      ◎ 提供一个信号处理函数


一、信号

     ◎ 基本概念

        信号机制是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。举个例子:

        ① 用户输入命令,在shell下启动一个前台进程

        ② 用户键盘输入Ctrl+C产生一个硬件中断。如果当前CPU正在执行这个程序的代码,则代码暂停执行,CPU从用户态切到内核态来处理这个硬件中断

        ③ 终端驱动程序将Ctrl+C解释成SIGINT信号,记录在该进程的PCB中;

        ④ 当某个时刻要从内核态返回该进程用户空间代码继续执行,首先要处理PCB中记录的信号,发现有一个SIGINT信号未处理,而这个信号的默认处理动作是终止进程,所以直接终止进程而不再返回它的用户空间代码执行。

     

     ◎ 简单分类

        使用 kill -l 命令可以查看系统定义的信号列表:

        

        对这些信号做一个简单的分类:1~31这31个信号称为非实时信号,它们不支持排队,都不可靠;而34~64这31个信号是实时信号,支持排队,都是可靠信号。

二、信号的产生

        产生信号的主要方式有:① 通过终端按键产生信号;② 调用系统函数向进程发信号;③ 由软件条件产生信号。

     ◎ 通过终端按键产生信号

        用户在终端按下某些键时,终端驱动程序会向前台进程发送信号。比如Ctrl+C 产生SIGINT信号,Ctrl+\ 产生SIGQUIT信号,Ctrl+Z 产生SIGTSTP信号等。

        其中,SIGTSTP信号的默认处理动作是终止进程并且Core Dump。Core Dump是指当一个进程异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常为core。进程异常终止通常是因为Bug,事后可以通过调试器检查core文件以查找错误原因,这叫做Post-mortem Debug(事后调试)。默认是不允许产生core文件的,但开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。

        ulimit -a (显示当前所有的资源限制):

             

        ulimit -c 1024 (允许core文件最大为1024k):

             

       在前台执行一个死循环程序,然后在终端键入Ctrl+\:

             

        这时会生成一个core文件,接着就可以使用core文件了:

          

     

     ◎ 调用系统函数向进程发信号

        命令部分学过,利用kill 命令可以发送信号给某个进程,而kill命令是调用kill函数实现的。当内核检测到某种软件条件发生时已可以通过信号通知进程,比如闹钟超时产生SIGALRM信号,向读端已关闭的管道写数据时产生SIGPIPE信号等。

        在后台执行死循环程序,用kill命令向它发送SIGSEGV信号:

             

        kill命令是调用kill 函数实现的。kill 函数可以给一个指定的进程发送指定的信号。

        

        raise函数可以给当前进程发送指定信号(自己向自己发送信号)。

         

            

       运行结果:

            

     ◎ 由软件条件产生信号

       调用alarm 函数可以设定一个闹钟,即告诉内核在seconds 秒之后给当前进程发送SIGALRM信号,该信号的默认处理动作是终止当前进程。

       

         

        这个程序的作用是1秒之内一直累加,1秒之后被SIGALRM信号终止。

        运行结果:

          

三、信号的处理动作

      ◎ 忽略此信号

      ◎ 执行该信号的默认处理信号

      ◎ 提供一个信号处理函数

        要求内核在出炉该信号时切换到用户态执行这个处理函数,这种方式称为捕捉一个信号。

        signal函数

        

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值