Linux信号介绍

来源:互联网 发布:f3飞控调参软件cf 编辑:程序博客网 时间:2024/04/20 06:03

概述

信号是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式。目前Linux信号不仅能告诉某一进程发生了什么事,还能给进程传递数据。


信号的来源

硬件方式
  • 当用户在终端上按下某些键的时候,将产生信号,如CTRL+C组合键将产生SIGINT信号
  • 硬件异常产生信号,如除数为0,无效的存储访问
软件方式
  • 在终端下使用kill命令向进程发送任意信号
  • 进程调用kill或sigqueue函数发送信号
  • 当检测到某种软件条件已经具备时发出信号,由alarm或settimer设置的定时器超时将产生SIGALRM信号

信号的种类

在shell下输入kill-l可显示Linux系统支持的全部信号,如图:
这里写图片描述
信号的值在signal.h中定义,以上所有信号都有一定的含义,在此不一一陈述。

可靠信号与不可靠信号

在上图中,1号到31号之间的信号都是继承自UNIX系统,是不可靠的信号,33号到64号之间的信号都是可靠信号,也称为实时信号。

信号的可靠性是指信号是否会丢失,或者说该信号是否会排队

当导致信号产生的事件发生时,内核就产生一个信号。信号产生后,内核通常会在进程表中设置某种形式的标志。当内核设置了这个标识,我们就说内核向一个进程递送了一个信号。信号产生和递送之间的时间间隔,我们称为信号未决

还有一种判断可靠信号与不可靠信号的方法,我们可以调用sigpending将信号设置为阻塞,如果一个进程产生了一个阻塞的信号,而对该信号的动作是捕捉该信号,则内核将为该进程的此信号保持为未决状态,直到该进程对此信号解除阻塞或将对此信号的响应更改为忽略。如果在进程解除对某个信号的阻塞之前,这个信号发生了多次,那么如果该信号被递送多次则称该信号为可靠信号,只被递送一次的信号被称为不可靠信号。

信号的优先级

如果一个进程有多个未决信号,则对于同一个未决的实时信号,内核按照发送的顺序来递送信号。如果存在多个未决的实时信号,则编号越小的先被递送。如果既存在实时信号,又存在不可靠信号,大部分Linux系统会优先递送不可靠信号。


进程对信号的响应

当信号发生时,用户可以用下列三种方式之一对信号做出响应。

  • 捕捉信号。对于要捕捉的信号,可以为其指定信号处理函数,信号发生时该函数自动被调用,在该函数内部实现对该信号的处理
  • 忽略信号。大部分信号都可以被忽略,但是SIGKILL和SIGSTOP这两个信号是不能被忽略的,同时这两个信号也不能被捕获和阻塞。此外,如果忽略某些由硬件异常产生的信号(非法访问存储或除以0),则进程的行为是不可预测的
  • 按照系统默认的方式进行处理。大部分信号的默认操作是终止进程,所有的实时信号的默认动作都是终止进程。
0 0
原创粉丝点击