原标题:Shell 信号发送与捕捉

作者:李振良OK

1、Linux信号类型

信号(Signal):信号是在软件层次上对中断机制的一种模拟,通过给一个进程发送信号,执行相应的处理函数。

进程可以通过三种方式来响应一个信号:

1)忽略信号,即对信号不做任何处理,其中有两个信号不能忽略:SIGKILL及SIGSTOP。

2)捕捉信号。

3)执行缺省操作,Linux对每种信号都规定了默认操作。

Linux究竟采用上述三种方式的哪一个来响应信号呢?取决于传递给响应的API函数。

Linux支持的信号有:

编号

信号名称

缺省动作

描述

1

SIGHUP

终止

终止进程,挂起

2

SIGINT

终止

键盘输入中断命令,一般是CTRL+C

3

SIGQUIT

CoreDump

键盘输入退出命令,一般是CTRL+

4

SIGILL

CoreDump

非法指令

5

SIGTRAP

CoreDump

trap指令发出,一般调试用

6

SIGABRT

CoreDump

abort(3)发出的终止信号

7

SIGBUS

CoreDump

非法地址

8

SIGFPE

CoreDump

浮点数异常

9

SIGKILL

终止

立即停止进程,不能捕获,不能忽略

10

SIGUSR1

终止

用户自定义信号1,像Nginx就支持USR1信号,用于重载配置,重新打开日志

11

SIGSEGV

CoreDump

无效内存引用

12

SIGUSR2

终止

用户自定义信号2

13

SIGPIPE

终止

管道不能访问

14

SIGALRM

终止

时钟信号,alrm(2)发出的终止信号

15

SIGTERM

终止

终止信号,进程会先关闭正在运行的任务或打开的文件再终止,有时间进程在有运行的任务而忽略此信号。不能捕捉

16

SIGSTKFLT

终止

处理器栈错误

17

SIGCHLD

可忽略

子进程结束时,父进程收到的信号

18

SIGCONT

可忽略

让终止的进程继续执行

19

SIGSTOP

停止

停止进程,不能忽略,不能捕获

20

SIGSTP

停止

停止进程,一般是CTRL+Z

21

SIGTTIN

停止

后台进程从终端读数据

22

SIGTTOU

停止

后台进程从终端写数据

23

SIGURG

可忽略

紧急数组是否到达socket

24

SIGXCPU

CoreDump

超出CPU占用资源限制

25

SIGXFSZ

CoreDump

超出文件大小资源限制

26

SIGVTALRM

终止

虚拟时钟信号,类似于SIGALRM,但计算的是进程占用的时间

27

SIGPROF

终止

类似与SIGALRM,但计算的是进程占用CPU的时间

28

SIGWINCH

可忽略

窗口大小改变发出的信号

29

SIGIO

终止

文件描述符准备就绪,可以输入/输出操作了

30

SIGPWR

终止

电源失败

31

SIGSYS

CoreDump

非法系统调用

CoreDump(核心转储):当程序运行过程中异常退出时,内核把当前程序在内存状况存储在一个core文件中,以便调试。

Linux支持两种信号:

一种是标准信号,编号1-31,称为非可靠信号(非实时),不支持队列,信号可能会丢失,比如发送多次相同的信号,进程只能收到一次,如果第一个信号没有处理完,第二个信号将会丢弃。

另一种是扩展信号,编号32-64,称为可靠信号(实时),支持队列,发多少次进程就可以收到多少次。

信号类型比较多,我们只要了解下,记住几个常用信号就行了,红色标记的我觉得需要记下。

发送信号一般有两种情况:

一种是内核检测到系统事件,比如键盘输入CTRL+C会发送SIGINT信号。

另一种是通过系统调用kill命令来向一个进程发送信号。

2、kill命令

kill命令发送信号给进程。

命令格式:kill [-s sigspec | -n signum | -sigspec] pid | jobspec ...

kill -l [sigspec]

-s # 信号名称

-n # 信号编号

-l # 打印编号1-31信号名称

示例:

给一个进程发送终止信号:

kill-s SIGTERM pid

kill-n 15 pid

kill-15 pid

kill-TREM pid

3、trap命令

trap命令定义shell脚本在运行时根据接收的信号做相应的处理。

命令格式:trap [-lp] [[arg] signal_spec ...]

-l #打印编号1-64编号信号名称

arg # 捕获信号后执行的命令或者函数

signal_spec # 信号名或编号

一般捕捉信号后,做以下几个动作:

1)清除临时文件

2)忽略该信号

3)询问用户是否终止脚本执行

示例1:按CTRL+C不退出循环

#!/bin/bash

trap""2 # 不指定arg就不做任何操作,后面也可以写多个信号,以空格分隔

fori in{1..10}; do

echo$i

sleep 1

done

# bash a.sh

1

2

3

^C4

5

6

^C7

8

9

10

示例2:循环打印数字,按CTRL+C退出,并打印退出提示

#!/bin/bash

trap"echo 'exit...';exit"2

fori in{1..10}; do

echo$i

sleep 1

done

# bash test.sh

1

2

3

^Cexit...

示例3:让用户选择是否终止循环

#!/bin/bash

trap"func"2

func{

read-p "Terminate theprocess? (Y/N): "input

if[ $input== "Y"] ; then

exit

fi

}

fori in{1..10}; do

echo$i

sleep 1

done

# bash a.sh123^CTerminate the process? (Y/N): Y# bash a.sh123^CTerminate the process? (Y/N): N456...返回搜狐,查看更多

责任编辑:

linux 信号 core,Shell 信号发送与捕捉相关推荐

  1. 第九章 Shell信号发送与捕捉

    9.1 Linux信号类型 信号(Signal):信号是在软件层次上对中断机制的一种模拟,通过给一个进程发送信号,执行相应的处理函数. 进程可以通过三种方式来响应一个信号: 1)忽略信号,即对信号不做 ...

  2. Shell 信号发送与捕捉

    1.Linux信号类型 信号(Signal):信号是在软件层次上对中断机制的一种模拟,通过给一个进程发送信号,执行相应的处理函数. 进程可以通过三种方式来响应一个信号: 1)忽略信号,即对信号不做任何 ...

  3. Linux系统编程30:进程信号之产生信号的四种方式(Core Dump,kill,raise)

    文章目录 (1)通过按键产生信号-Core Dump (2)调用系统函数向进程发送信号 A:kill B:raise C:abort (3)由软件条件产生信号 (4)硬件异常产生信号 总结: 为了方便 ...

  4. linux系统编程之信号(四):信号的捕捉与sigaction函数

    一.内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号.由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SI ...

  5. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

  6. Linux系统编程----7(信号集,信号屏蔽,信号捕捉)

    信号集操作函数 内核通过读取未决信号集来判断信号是否应被处理.信号屏蔽字 mask 可以影响未决信号集.而我们可以在应 用程序中自定义 set 来改变 mask.已达到屏蔽指定信号的目的. 信号集设定 ...

  7. Linux信号列表(非实时信号和实时信号)

    列表中,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为34 ~ 64的信号是后来扩充的,称做可靠信号(实时信号).两者区别: 标准信号的局限性: 1. 阻塞信号可能 ...

  8. sigquit信号默认忽略吗_老妹儿,你真的搞懂了 Shell 信号吗?

    作者:李振良OK链接:https://blog.51cto.com/lizhenliang/1899347 哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里 ...

  9. 实验2-3-3 信号处理总结以及Linux下支持的信号列表

    一.例子 1.代码: 2.编译后运行如下: 可以看出进程正在等待信号SIGBUS 3.发送SIGBUS信号---用kill 首先我们看一下kill用法:在终端输入man kill,得: 于是我们就可以 ...

最新文章

  1. C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)
  2. IntelliJ-将Java项目/模块转换为Maven项目/模块
  3. golang println与printf区别
  4. php文本文件操作,PHP文本操作类
  5. .net获取地址栏中的url
  6. mitdump爬取当当网APP图书目录
  7. java弹出提示窗口_Java实现弹窗效果的基本操作(2)
  8. python中网页关闭再打开_Python Selenium 之关闭窗口close与quit的方法
  9. python升级版本命令_如何在python中安装和配置kivy库
  10. putty和WinSCP后门检查及清理方式
  11. Html中代码换行造成空格间距的问题
  12. 硬件与分析-音速小子
  13. python差分进化算法_差分进化算法(differential evolution)的Python实现
  14. win10计算机管理员的权限才能删除,Win10文件夹删除不了需要管理员权限怎么办?Win10文件夹删除不了需要管理员权限的解决方法...
  15. APP支付和H5网页支付有哪些不同?
  16. JS Worker执行多线程
  17. 零基础成为网络工程师经验分享,附完整学习路线
  18. 【产业互联网周报】华为面向鲲鹏计算产业启动数据基础设施战略;阿里王坚当选中国工程院院士...
  19. 超直线能否用于真实物理空间?
  20. 华为那个手机是鸿蒙,EMUI 11就是鸿蒙前奏 华为手机全面升级鸿蒙OS稳了

热门文章

  1. VC++程序中用PlaySound函数加入自定义声音
  2. Linux命令——mv
  3. 什么是条带化(striping) ?(转载)
  4. ReentrantLock 实现原理
  5. 新型攻击接踵而来 思科Talos解析Jaff勒索软件
  6. Linux及文件系统基本介绍
  7. 解决小米手机无法收到开机广播的问题
  8. solrj 使用记录 - 添加文档
  9. 自定义的GridView控件源代码
  10. spring中的quartz调度问题