信号基础介绍


title: 信号基础介绍
date: 2019-08-04 15:29:47
tags: Linux
categories: Linux

1、信号的本质

       

        软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。 在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用Kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息

2、信号的来源

信号的来源可以有很多中,按照产生条件的不同可以分为硬件和软件两种。

  • 硬件方式

            当用户在终端上按下某键时,将产生信号。如按下组合键(ctrl + c)后将产生一个SIGINT信号。硬件异常产生信号:除数据,无效的存储访问等。这些事件通常由硬件(如:CPU)检测到,并将其通知给linux 操作系统内核,然后内核生成相应的信号,并把信号发送给该事件发生时正在进行的程序。

  • 软件方式

            用户在终端下调用Kill命令向进程发送任务信号进程调用kill 函数或sigqueue 函数发送信号。当检测到某种软件条件已经具备时发出信号,如由alarm 或settimer设置的定时器超时时将生成SIGALARM信号。

3、信号的分类

①、可靠信号与不可靠信号

        Linux信号机制基本上是从unix 系统中继承过来 的。早期unix系统中的信号机制比较简单和原始,信号值小于SIGRTMIN的信号都是不可靠信号。这就是不可靠信号的来源。它的主要问题是信号可能丢失

        随着时间的发展,实践证明了有必要对信号的原始机制加以改进和扩充。由原来定义的信号已有许多应用,不好再做改动,最终只好又新增了一些信号,并在MIN和一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。信号值位于SIGRT和SIGRTMAX之间的信号都是可靠信号,可靠信号克服了信号可能丢失的问题

        信号是否支持排队只与信号值有关,SIGRTMIN以前的信号都是不支持排队的,不可靠的。

②、实时信号与非实时信号

        早期 Unix 系统只定义了 32 种信号,前 32 种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作。如按键盘的 CTRL ^C 时,会产生 SIGINT 信号,对该信号的默认反应就是进程终止。后 32 个信号表示实时信号,等同于前面阐述的可靠信号。这保证了发送的多个实时信号都被接收。非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。

        也就是说SIGRTMIN信号以前的都是非实时的不可靠信号,SIGRTMIN信号以后的都是实时可靠的信号。

4、信号的优先级

        信号实质上是软中断,中断有优先级,信号也有优先级。如果一个进程有多个未处理的信号,则对于同一个未处理的实时信号,内核将按照发送的顺序来递送信号。如果存在多个未处理信号,则值(或者说编号)越小的越先被递送。如果即存在不可靠信号,又存在可靠信号(实时信号),虽然 POSIX 对这一情况没有明确规定,但 Linux 系统和大多数遵循 POSIX 标准的操作系统一样,将优先递送不可靠信号。

5、信号的列表

查看所有信号: kill -l

信号的值定义在 signal.h 中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LCY8ybTW-1625302975872)(\images\进程线程\信号.png)]

各信号的含义如下

**1) SIGHUP:**当用户退出 Shell 时,由该 Shell 启动所有进程都接收到这个信号,默认动作为终止进程。

**2) SIGINT:**用户按下组合键时,ctrl c 用户端时向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程。

3) SIGQUIT:当用户按下组合键(ctrl + \ )时产生该信号,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程并产生 core 文件。

4) SIGILL: CPU 检测到某进程执行了非法指令。默认动作为终止进程并产生 core 文件*

**5) SIGTRAP:**该信号由断点指令或其他 trap 指令产生。默认动作为终止进程并产生 core 文件。

**6) SIGABRT:**调用 abort 函数时产生该信号。默认动作为终止进程并产生 core 文件。

7) SIGBUS:非法访问内存地址,包括内存地址对齐(alignment)出错,默认动作为终止进程并产生 core文件。

**8) SIGFPE:**在发生致命的算术错误时产生。不仅包括浮点运行错误,还包括溢出及除数为 0 等所有的算术错误。默认动作为终止进程并产生 core 文件。

**9) SIGKILL:**无条件终止进程。本信号不能被忽略、处理和阻塞。默认动作为终止进程。它向系统管理员提供了一种可以杀死任何进程的方法。

**10) SIGUSR1:**用户定义的信号,即程序可以在程序中定义并使用该信号。默认动作为终止进程。

**11) SIGSEGV:**指示进程进行无效的内存访问。默认动作为终止进程并使用该信号。默认动作为终止进程。

**12) SIGUSR2:**这是另外一个用户定义信号,程序员可以在程序中定义并使用该信号。默认动作为终止进程。

13) SIGPIPE: Broken pipe:向一个没有读端的管道写数据。默认动作为终止进程。------管道通信的时候会产生。

**14) SIGALRM:**定时器超时,超时的时间由系统调用 alarm 设置。默认动作为终止进程。

**15) SIGTERM:**程序结束(terminate)信号,与 SIGKILL 不同的是,该信号可以被阻塞和处理。通常用来要求程序正常退出。执行 Shell 命令 kill 时,缺少产生这个信号。默认动作为终止进程。

**16) SIGCHLD:**子程序结束时,父进程会收到这个信号。默认动作为忽略该信号。

**17) SIGCONT:**让一个暂停的进程继续执行。

**18) SIGSTOP:**停止(stopped)进程的执行。本信号不能被忽略、处理和阻塞。默认作为暂停进程。

**19) SIGTSTP:**停止进程的动作,但该信号可以被处理和忽略。按下组合键时发出该信号。默认动作为暂停进程。

**20) SIGTTIN:**当后台进程要从用户终端读数据时,该终端中的所有进程会收到 SIGTTIN 信号。默认动作为暂停进程。

21) SIGTTOU:该信号类似于 SIGTIN,在后台进程要向终端输出数据时产生。默认动作为暂停进程。

**22) SIGURG:**套接字(socket)上有紧急数据时,向当前正在运行的进程发出此信号,报告有紧急数据到达。默认动作为忽略该信号。

**23) SIGXCPU:**进程执行时间超过了分配给该进程的 CPU 时间,系统产生该信号并发送给该进程。默认动作为终止进程。

**24) SIGXFSZ:**超过文件最大长度的限制。默认动作为 终止进程并产生 core 文件。

**25) SIGVTALRM:**虚拟时钟超时时产生该信号。类似于 SIGALRM,但是它只计算该进程占有用的 CPU 时间。默认动作为终止进程。

**26) SIGPROF:**类似于 SIGVTALRM,它不仅包括该进程占用的 CPU 时间还抱括执行系统调用的时间。默认动作为终止进程。

**27) SIGWINCH:**窗口大小改变时发出。默认动作为忽略该信号。

**28) SIGIO:**此信号向进程指示发出一个异步 IO 事件。默认动作为忽略。

**29) SIGPWR:**关机。默认动作为终止进程。

30) SIGSYS: 非法系统调用

31) SIGRTMIN~SIGRTMAX: Linux 的实时信号,它没有固定的含义(或者说可以由用户自由使用)。

**注意:**Linux 线程机制使用了前 3 个实时信号。所有的实时信号的默认动作都是终止进程。

core 文件:在一个程序崩溃时,它一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。

6、键盘产生的信号

Ctrl+c 发送 SIGINT 信号给前台进程组中的所有进程, 常用于终止正在运行的程序。

Ctrl+z 发送 SIGTSTP 信号给前台进程组中的所有进程, 挂起一个进程,使用 fg 命令把它恢复回前台。

Ctrl+d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF(-1)。

Ctrl+ / 发送 SIGQUIT 信号给前台进程组中的所有进程,终止前台进程并生成 core 文件。

7、信号处理方式

收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:

1. SIG_DFL 信号专用的默认动作:

        如果默认动作是暂停线程,则该线程的执行被暂时挂起。当线程暂停期间,发送给线程的任何附加信号                都不交付,直到该线程开始执行,但是 SIGKILL 除外。把挂起信号的信号动作设置成 SIG_DFL,且其默                认动作是忽略信号 (SIGCHLD)。

2. SIG_IGN 忽略信号

        该信号对进程没有影响,对该信号不做任何处理,就象未发生过一样。

3. 执行用户希望的动作:

        通知内核在某种信号发生时,调用一个用户函数,在用户函数中,执行用户希望的处理。

注意:

程序不可捕获、阻塞或忽略的信号有: SIGKILL,SIGSTOP;

不能恢复至默认动作的信号有:SIGILL,SIGTRAP

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值