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

应的处理函数。

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

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

  • 捕捉信号,修改捕捉到的信号的缺省操作。

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

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

CoreDump(核心转储):当程序运行过程中异常退出时,内核把当前程序在内存状况存储在一个core 文件中,以便调试。执行命令 ulimit -c 如果是 0 则没有开启,也不会生成 core dump 文件,可通过 ulimit -c unlimited 命令临时开启 core dump 功能,只对当前终端环境有效,如果想永久生效,可修改/etc/security/limites.conf 文件,添加一行 "* soft core unlimited"默认生成的 core 文件保存在可执行文件所在的目录下,文件名为 core。如果想修改 core 文件保存路径,可通过修改内核参数:echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern则文件名格式为 core-命名名-pid-时间戳

Linux 支持两种信号:

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

  • 另一种是扩展信号,编号 32-64,称为可靠信号(实时),支持队列,发多少次进程就可以收到多少次。信号类型比较多,我们只要了解下,记住几个常用信号就行了,红色标记的我觉得需要记下。

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

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

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

kill 命令

格式:kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

  • -s # 信号名称

  • -n # 信号编号

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

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

kill -s SIGTERM pid

kill -n 15 pid

kill -15 pid

kill -TREM pid

trap 命令

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

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

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

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

  • signal_spec # 信号名或编号

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

  • 清除临时文件

  • 忽略该信号

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

trap '触发指令' 信号

忽略信号的操作

trap '' 信号

恢复原信号的操作

trap '-' 信号

列出自定义信号操作

trap -p

当脚本退出时,执行finish函数

trap finish EXIT

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

#!/bin/bash

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

for i in {1..10}; do

echo $i

sleep 1

done

最新文章

  1. hibernate框架int和Integer类型区别
  2. [LintCode] Best Time to Buy and Sell Stock II 买股票的最佳时间之二
  3. HDU 5652(二分+广搜)
  4. js DOM优化相关探索
  5. WCF: 没有终结点在侦听可以接受消息的 这通常是由于不正确的地址或者 SOAP 操作导致的。
  6. 从配置sublimeClang插件中学到的
  7. CSS 类选择器(四)
  8. ModelProxy 前端接口配置建模框架
  9. RobotFramework+Selenium2library+Appium+Python+RIDE安装指南
  10. UIAlertController 的使用(NS_CLASS_AVAILABLE_IOS(8_0)iOS8以后有效)
  11. AsMVC:一个简单的MVC框架的Java实现
  12. delphi按钮控件的default属性
  13. TestNg JAVA 自动化单元测试框架Demo
  14. 关于window.location.href="delete_emp.do?id"+id;
  15. OSS内文件如何设置为无时间限制的下载链接
  16. jumpservice配置:快速入门
  17. ajax @requestBody
  18. MarkdownPad使用
  19. 看懂「www.google.com」背后的逻辑
  20. Struts2漏洞检查工具

热门文章

  1. Android、iOS平台RTMP/RTSP播放器实时音量调节
  2. php统计IP PV和今日访问量统计方法
  3. flutter系列之:UI layout简介
  4. git merge和git rebase总结
  5. Docker和containerd在容器日志及相关参数配置方面的一些差异
  6. host主机监控规则
  7. 通过 Docker 部署 Redis 6.x 集群
  8. 8Hello world
  9. css3_媒介查询
  10. InnoDB关于事务、锁、MVCC专题