1 信号的意义

在linux系统中信号是与进程通信的一种手段。假设没有信号,linux中的进程一旦运行起来将不再受控,这种局面对于进程的管理来说是一种灾难。kill、ctrl+c等操作本质上就是我们向linux发出的信号,进程接收到信号后根据相应的策略做出反馈。

2 信号的来源

A) 通过终端(组合键)产生信号

最典型的ctrl+c终止当前进程

B) 硬件异常产生信号

例如进程运行中内存的寻址出现异常,就会发出信号。

C) 显式的调用linux命令产生信号

最典型的kill命令,通过linux命令发出信号干预进程运行

D) 软件代码发送信号

Java本地方法、Python signal类包等,通过程序发出信号。

3 有哪些信号

执行命令$kill -l可以看到信号列表

可以看到有62种信号,32、33轮空;1-31号为不可靠信号,是linux自带的与进程通信的信号;34-64是可靠信号,是为了弥补linux不可靠信号太少而扩展的。不可靠信号多次发出最终只响应1次;而可靠信号每次都有响应。

执行命令$man 7 signal可以更详细的查看每一种信号的意义:

例如我们前面说过的ctrl+c,对应的是2号sigint;kill对应的是9号sigkill;内存错误对应的11号sigsegv。

4 进程会如何处理这些信号

并不是每种信号进程都要给出反馈的,进程对待信号会有3种策略:

A) 忽略此信号

好理解,就是假装没看见,不鸟它。

B) 执行默认动作

例如终止进程等

C) 提供一个信号处理函数,要求内核执行该函数

通过某种形式在发送信号时同时给定处理信号的函数,相当于回调函数

5 python对信号的支持

Python对信号的操作在importsignal这个包里,有了前面知识的积累,我们很好理解signal包调用的侧重点:哪种信号?如何处理?如何发送?

A) 哪种信号?

Linux的62种信号,signal包已经都搬到python中来了,需要开发人员自己选择一种

B) 如何处理?

Signal默认提供了Ignal和Default2种策略,同时支持开发人员自定义回调函数

C) 如何发送?

Signal对信号的发送做了简易的封装,例如alarm()函数发起sigalrm信号

6 案例,做一个timeout的自定义annotation:

import signaldef timeout(seconds=10, error_message="connect to server timeout"):def decorator(func):def _handle_timeout(signum, frame):raise TimeoutError(error_message)def wrapper(*args, **kwargs):signal.signal(signal.SIGALRM, _handle_timeout)signal.alarm(seconds)try:result = func(*args, **kwargs)finally:signal.alarm(0)return resultreturn wraps(func)(wrapper)return decorator

先定制了一个回调函数decorator,超时后直接抛异常;

然后通过signal.signal()方法决定了信号种类和处理方式,第一个参数可以替换成62种信号的其中一种,第二个参数还可以传入SIG_DFL或SIG_IGN;

最后通过signal.alarm()函数发起信号。

这样我就自己开发了一个超时处理机制。

@timeout(1200)
def ready_host(**not_connected):while True:if not any(not_connected):breakfor h in not_connected.keys():if check_port_is_open(h):del not_connected[h]return True

这是个批量验证网络连接的函数,not_connected是个集合存放着需要做尝试的所有远程机器,我通过@timeout(1200)的方式设定等待20分钟后如果测试还没有全部通过就抛出异常。

python之signal操作相关推荐

  1. Python语音基础操作--4.3共振峰估计

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  2. 浅析Python中signal包的使用

    原文链接:https://www.jb51.net/article/74844.htm 这篇文章主要介绍了Python中signal包的使用,主要在Linux系统下对进程信号进行相关操作,需要的朋友可 ...

  3. python(10): Signal

    信号Signal 信号Signal的全称为软中断信号,是用来通知进程发生了异步事件,是在软件层次上对中断机制的一种模拟.原理上一个进程收到一个信号与CPU收到一个中断请求可以说是类似的. 信号是进程间 ...

  4. python subprocess相关操作

    python subprocess常用操作 1.subprocess模块的常用函数 函数 描述 subprocess.run() Python 3.5中新增的函数.执行指定的命令,等待命令执行完成后返 ...

  5. Python语音基础操作--5.1自适应滤波

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  6. Python语音基础操作--10.1基于动态时间规整(DTW)的孤立字语音识别试验

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  7. Python语音基础操作--3.5线性预测分析

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  8. python模块—signal

    文章目录 信号 介绍 生命周期 信号处理 信号表示 信号分类 信号通信 常用信号 python signal 信号 介绍 信号signal的全称是软中断信号,是用来通知进程发生的异步事件,是在软件层次 ...

  9. Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8

    我使用python的MySQLdb模块实现了一个mysql client, 在测试时,出现了如下错误 Python模块MySQLdb操作mysql出现2019错误:Can't initialize c ...

最新文章

  1. android固定位置滚动文本,android – 滚动文本上方的按钮,按钮固定在底部
  2. R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(自定义边界调色板、brewer调色板、比例灰度)实战
  3. android教程 - android ui 介绍,多图详解 “Android UI”设计官方教程
  4. CMS sell in customizing
  5. 看新闻的时间用的太多了
  6. ajax后台重定向会返回什么_跳转,AJAX返回和重定向
  7. Flash小玩意图案创作:新增MulCircle和圆环
  8. 【Level 08】U08 Positive Attitude L5 Satisfy your need to know
  9. 服务端_多面手之服务端测试
  10. docker客户端和服务端
  11. 有赞 WEB-UI 自动化实践
  12. 移动端UI设计尺寸适配
  13. 下载百度排行榜音乐的程序(Perl)
  14. Jenkins基础: root URL设定
  15. matlab如何拼接矩阵
  16. 网传鸿蒙系统测试版pS,鸿蒙系统测试版3.0-鸿蒙系统app测试版3.0安卓v3.0下载-pszxw下载站...
  17. Xpath语法之谓语小记
  18. 深入浅出HTTP协议
  19. html5实现图片预览和查看原图
  20. QT APP实战-图片播放器

热门文章

  1. 企业高管IT战略指南——企业为何要落地DevOps?
  2. for循环打印九九乘法表
  3. JavaSE语言基础
  4. JavaWeb会话和会话技术之Cookie
  5. 服务器显示器白屏,电脑显示器白屏的原因以及处理方法
  6. mysql 存储过程 sqlyog_sqlyog写mysql存储过程
  7. 问题:oracle id自增 insert语句如何写?
  8. 2022-2027年中国汽油市场规模现状及投资规划建议报告
  9. 设计模式3-软件设计原则
  10. Windows 快捷方式