signal包负责在Python程序内部处理信号。典型的操作包含预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。

要注意,signal包主要是针对UNIX平台(比方Linux, MAC OS)。而Windows内核中因为对信号机制的支持不充分,

所以在Windows上的Python不能发挥信号系统的功能。

定义信号名

signal包定义了各个信号名及其相应的整数。比方

import signal
print signal.SIGALRM
print signal.SIGCONT

Python所用的信号名和Linux一致。

能够通过

$man 7 signal

查询

预设信号处理函数

signal包的核心是使用signal.signal()函数来预设(register)信号处理函数,例如以下所看到的:

singnal.signal(signalnum, handler)

signalnum为某个信号。handler为该信号的处理函数。

我们在信号基础里提到。进程能够无视信号,能够採取默认操作,还能够自己定义操作。

当handler为signal.SIG_IGN时,信号被无视(ignore)。

当handler为singal.SIG_DFL,进程採取默认操作(default)。

当handler为一个函数名时。进程採取函数中定义的操作。

import signal
# Define signal handler function
def myHandler(signum, frame):
print("I recerive signal:", signum) # Register signal.SIGTSTP's handler
signal.signal(signal.SIGTSTP, myHandler)
siganl.pause()
print("End")

在主程序中。首先使用signal.signal()函数来预设信号处理函数。

然后我们运行signal.pause()来让该进程暂停以等待信号。以等待信号。

当信号SIGUSR1被传递给该进程时,进程从暂停中恢复。并依据预设,运行SIGTSTP的信号处理函数myHandler()。

myHandler的两个參数一个用来识别信号(signum)。还有一个用来获得信号发生时,进程栈的状况(stack frame)。

这两个參数都是由signal.singnal()函数来传递的。

上面的程序能够保存在一个文件里(比方test.py)。

我们使用例如以下方法执行:

$python test.py

以便让进程执行。

当程序执行到signal.pause()的时候,进程暂停并等待信号。

此时,通过按下CTRL+Z向该进程发送SIGTSTP信号。

能够看到。进程运行了myHandle()函数, 随后返回主程序。继续运行。

当然,也能够用$ps查询process ID, 再使用$kill来发出信号。

进程并不一定要使用signal.pause()暂停以等待信号,它也能够在进行工作中接受信号。

比方将上面的signal.pause()改为一个须要长时间工作的循环。

能够依据自己的须要更改myHandler()中的操作。以针对不同的信号实现个性化的处理。

import signal
# Define signal handler function
def myHandler(signum, frame):
print("Now,it's time") # Register signal.SIGTSTP's handler
signal.signal(signal.SIGALRM, myHandler)
signal,alarm(5)
while True:
print("End")

这里用了一个无限循环以便让进程持续执行。

在signal.alarm()运行5秒之后,进程将向自己发出SIGALRM信号。随后。信号处理函数myHandler開始运行。

发送信号

signal包的核心是设置信号处理函数。

除了signal.alarm()向自身发送信号之外。并没有其它发送信号的功能。

但在os包中。有类似于linux的kill命令的函数。分别为

os.kill(pid, sid)

os.killpg(pgid, sid)

分别向进程和进程组(见Linux进程关系)发送信号。sid为信号所相应的整数或者singal.SIG*。

实际上signal, pause,kill和alarm都是Linux应用编程中常见的C库函数。在这里,我们仅仅只是是用Python语言来实现了一下。

实际上,Python 的解释器是使用C语言来编写的。所以有此相似性也并不意外。

此外,在Python 3.4中,signal包被增强,信号堵塞等功能被增加到该包中。

Python学习笔记14:标准库之信号量(signal包)的更多相关文章

  1. Python标准库07 信号 (signal包,部分os包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...

  2. C++ Primer学习笔记2--c++标准库中的 vector、string 和 bitset 类型

    一.string    #include <string>  using std::string    初始化函数:    string s1;        默认构造函数 s1 为空串 ...

  3. C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型

     标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更主要的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:由 ...

  4. python学习23之标准库

    '''''''''标准库1.datetime 日期时间模块存在于Lib/datetime.py文件内'''from datetime import datetime,date,time #from d ...

  5. Python 3 学习笔记之——标准库概述

    1. 操作系统接口 os 模块提供了一些与操作系统相关联的函数. >>> os.getcwd() # 获取当前工作目录 '/home/senius' >>> os. ...

  6. 吴裕雄--天生自然python学习笔记:beautifulsoup库的使用

    Beautiful Soup 库简介 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简 ...

  7. Python学习笔记之——requests库

    requests库一个优雅而简单的用于Python的HTTP库,可以极大的简化我们发送http请求及获取响应的代码. requests是python的第三方库,所以使用之前需要先安装. 1.安装之后就 ...

  8. python学习笔记(自定义库文件路径)

    博主最近在弄接口自动化.主要是基于python自带的unittest框架.包括 Pubilc模块定义所有接口. Main模块根据业务需求重新封装接口便于测试. config文件导入测试业务的固定参数. ...

  9. 【Python学习笔记】Pandas库之DataFrame

    1 简介 DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表. 或许说它可能有点像matlab的矩阵,但是matlab的矩阵只能放数值型值(当然matla ...

随机推荐

  1. bzoj 2794 [Poi2012]Cloakroom 离线+背包

    题目大意 有n件物品,每件物品有三个属性a[i], b[i], c[i] (a[i]<b[i]). 再给出q个询问,每个询问由非负整数m, k, s组成,问是否能够选出某些物品使得: 对于每个选 ...

  2. Mondriaan's Dream(poj 2411)

    题意:在n*m的方格里铺1*2的骨牌,有多少种方案 /* 第一次做插头DP,感觉和状压差不多. 这道题是利用上一行的状态来更新下一行的状态. 1代表上一行这个位置填了一个竖的(即本行可以填): 0代表 ...

  3. linux c 正则表达式

    #include <stdio.h> #include <regex.h> #include <mhash.h> int main() { regex_t rgx; ...

  4. net2:DropDownList的使用

    原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  5. 在 POSIX 线程编程中避免内存泄漏

    检测和避免 POSIX 线程内存泄漏的技巧 POSIX 线程(pthread)编程定义了一套标准的 C 编程语言类型.函数和常量 — 且 pthreads 提供了一种强大的线程管理工具.要充分使用 p ...

  6. Linux 之 Xunsearch(2)

    Linux 之 Xunsearch(2) 参考教程:[千峰教育] Xunsearch的项目配置文件: 基本说明: (1)项目配置是一个项目的核心灵魂,非常重要,通常保存为.ini文件, 通常存储在/u ...

  7. Yii CActiveForm 客户端验证(enableClientValidation)和自定义验证

    使用Yii的CActiveForm默认使用服务器端模型(model)的rules规则验证数据. 但这会导致无谓的请求提交,比较好的方式是为了用户体验在客户端也验证,而为了安全性,在服务器端和数据库也做 ...

  8. 洛谷——P1331 海战

    P1331 海战 题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防 ...

  9. Oracle if else 、case when 判断示例

    declare -- 声明奖金的变量 v_comm emp.comm%type; begin -- 查询出员工的奖金 select comm into v_comm from emp where em ...

  10. [置顶] Android 应用内禁止截屏功能的实现

    截图介绍   Android的调试工具DDMS提供有截屏功能,很多软件也会有截屏功能,在做支付等安全类应用的时候,为了保证用户的资产和系统安全,往往会禁止应用内截屏,禁止之后,在此应用处于前台的情况下 ...