linux python 信号,Python模块之信号(signal)

在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时发出SIGALRM等。要注意,signal包主要是针对UNIX平台(比如Linux, MAC OS),而Windows内核中由于对信号机制的支持不充分,所以在Windows上的Python不能发挥信号系统的功能。

信号(signal)-- 进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。

定义信号名

signal包定义了各个信号名及其对应的整数,比如:import signal

print(signal.SIGABRT)

print(signal.SIG_DFL)

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为一个函数名时,进程采取函数中定义的操作。参数SIG_IGNSIG_DFLhandler解释忽略默认处理类型的函数指针

实质#define SIG_IGN ((sighandler_t)1)#define SIG_IGN ((sighandler_t)0)执行自己写的代码# Define signal handler function

def myHandler(signum, frame):

print('I received: ', signum)

# register signal.SIGTSTP's handler

signal.signal(signal.SIGTSTP, myHandler)

#暂停进程,把当前进程置成就绪态,让出CPU,直到收到任意一个信号后终止,并且当处理完该信号之后,直接执行pause()函数下面的语句

signal.pause()

print('End of Signal Demo')

# 有问题待测试

在主程序中,我们首先使用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()中的操作,以针对不同的信号实现个性化的处理。

定时发出SIGALRM信号

一个有用的函数是signal.alarm(),它被用于在一定时间之后,向进程自身发送SIGALRM信号:import signal

# Define signal handler function

def myHandler(signum, frame):

print("Now, it's the time")

exit()

# register signal.SIGALRM's handler

signal.signal(signal.SIGALRM, myHandler)

signal.alarm(5)

while True:

print('not yet')

我们这里用了一个无限循环以便让进程持续运行。在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包被增强,信号阻塞等功能被加入到该包中。我们暂时不深入到该包中。

总结

signal.SIG*

signal.signal()

signal.pause()  signal.pause阻塞函数,让进程暂停以等待信号,也就时阻塞进程执行,简单来说当接收到信号后使进程停止。

signal.alarm()  常用作定时器,time为时间参数,单位为秒

SIGINT 表示终止进程

SIGQUIT 表示退出进程

SIGSTP 表示暂停进程

SIGKILL 表示结束某个进程,不能被忽略处理。

SIGALRM 表示时钟信号,常用作定时器,time为时间参数,单位为秒。

SIGSTOP表示停止某个进程,且不能被忽略处理。

SIGCHLD表示子进程发送给父进程信号

SIGCONT 继续执行暂停的进程

SIGINT     终止进程     中断进程,不可通过signal.signal()捕捉(相当于Ctrl+C)

SIGTERM    终止进程     软件终止信号,可通过signal.signal()捕捉(默认信号,当os.kill()没有指明信号类型时,默认的是该信号)

SIGKILL    终止进程     杀死进程,不可捕捉(相当于linux下的kill命令,windows下使用会抛出异常)

SIGALRM    闹钟信号     可以通过signal.alarm()和os.kill()发送该信号,可通过signal.signal()捕捉

windows下只能使用这几个信号:SIGABRT

SIGFPE

SIGILL

SIGINT

SIGSEGV

SIGTERM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你为什么喜欢VIM?

昨天看到的一个讨论,说vim有没有那么必要?所以写了这篇文章,在评论区说出你的观点,当然说出你的观点的时候,你拿不到一百万,也得不到小红花,但也是因为你的评论,我可能会开心一整天。…

新世纪篇章

团队blog开通http://www.cnblogs.com/team/solartimes.html还没弄明白怎么搞。。。一阵研究solartimes成员,快来注册。。。 转载于:https://www.cnblogs.com/konimeter/archive/2005/09/19/239671.html

RTT大牛告诉你,混合微内核是什么?

RT-Thread之前写过好几篇文章介绍微内核,然而不少开发者依然不清楚到底微内核操作系统是什么。为此,我们特别整理了5期快问快答,来为大家答疑解惑!RT-Thread Smart称作是混合微内核操作系统,为什么叫混合微内核操作系统…

linux操作指令及根目录介绍

1. 查看当做操作目录位置 > pwd 2. 查看(当前)目录里边的文件内容 > ls //list > ls -l 或ll //显示文件的详细信息 > ls -al //all显示文件的详细信息(包括隐藏文件) > ls -a //显示目录全部文件名字(包括隐藏文件) > ls [-al] 目录 //查看指定目录的文件信…

计算机linux运维日记,计算机的运维系统情况

其实,对于计算机的主要部件来说,计算机是有硬件和软件组成的,并且能够通过硬件和软件的协同工作完成了的,而对于一些计算机的硬件,则是由一些不同的部件进行完成的,那么其中主要的补间就是内存,…

Linux ALSA 图解

最近在解决一个音频的问题,所以正好借这个机会来把音频的东西重新梳理一下,总结是一个很好的习惯,能方便自以后遇到问题快速排查问题。平台「MT8167」内核版本「kernel 4.4」音频读数据函数流程tinyalsa调用读取函数IOCTL调用流程读取数据到应…

OpenGL学习笔记-坐标系统

转换关系: 局部坐标系 (模型矩阵)》 世界坐标系(观察矩阵)》观察坐标(投影矩阵)》裁剪坐标 Vclip Mprojection * Mview * Mmodel * Vlocal 裁剪空间(透视划分)》标准化设…

将一段复杂文本变成字符串的赋值语句

因为需要在C#的代码中,写入一大段的js代码和网页代码,试验已经没有问题了。实现时却碰到一个小问题,就是大段的js和html代码,应该以什么方式存在。最省事的方式,其实就是存在一个单独的文件中,每次读入即可…

ARM 原子操作里的两个汇编指令

今天一个读者朋友给我留言,问了这个问题,ARM原子操作的汇编代码,还给我截图了两个不同的解释,让我说哪个是正确的。原子操作的起因是为了内核同步,保证数据在正确性,之前已经吹过一波,可以看这几…

解决Ubuntu下pycharm无法输入中文的问题

sudo nautilus在这个界面中通过“计算机”进入pycharm.sh所在文件夹。一般在安装包的bin文件夹中。3、在文件pycharm.sh中添加红色字样内容(根据自己实际pycharm.sh文件内容适当添加)[maokxlocalhost bin]$ vi pycharm.sh# ----------------------------…

奥鹏20春在线作业c语言,电子科20春《C语言(专科)》在线作业3答案

试卷总分:100 得分:100一、单选题 (共 20 道试题,共 100 分)1.已知intb;则对指针变量p正确的说明和初始化是:()A.intpb;B.intp&b;C.int*pb;D.int*p&b;答案:2.对于int*p;inta[];pa;的合法运算()A.若p中的地址为100则p;运算后,则其值为100B.p;相当…

秒,在解答这个C语言题目上,我们都败了

看这篇文章之前,我觉得可以先看看下面这篇文章 看printk引发的一点思考不管我们用的printk还是printf,它们的核心都是可变参数的函数,所以可以拼接很多参数传递给函数实体,然后函数实体里面可以通过某种方式解析这些参数。看看这个…

为C++程序添加文件保存加载功能

一、引子为什么要浪费时间去设计一个算法来实现数据的文件存储还要费劲地调试代码呢?Boost库可以为你做这些事情。借助于串行化模板,你可以容易地把数据存储到你自己定制格式的文件中。本文将教给你如何轻松地存储数据并回读数据。二、概述当你开发一个软…

[Uva10641]Barisal Stadium(区间dp)

题意:按照顺时针给出操场的周边点,然后给出周围可以建设照明灯的位置,以及在该位置建设照明灯的代价,照明灯照射的范围与操场的边界相切,现在要求一个最小的花费,要求操场的所有边都被照射到。 解题关键:预…

常用c语言代码大全,C语言的一些常用代码

C语言经常需要发明各种轮子,为方便以后能够把精力放在应用逻辑上而不在发明轮子上,把一些常用的代码片段列于此。首先是字符串处理方面的,strcpy 函数容易越界,习惯使用 strncpy 函数,但此函数只管复制最多 n 个字符&a…

Linux kernel 同步机制(下篇)

之前的文章Linux kernel同步机制在上一部分,我们讨论了最基本常见的几类同步机制,这一部分我们将讨论相对复杂的几种同步机制,尤其是读写信号量和RCU,在操作系统内核中有相当广泛的应用。读写信号量(rw_semaphore&…

白话设计模式——Abstract Factory

Abstract Factory,把英文直接翻译过来的话就是“抽象工厂”,既然是工厂,那就肯定是生产产品的地方。不过,它不是生产同一类的产品,而是生产同一系列的产品。举个例子,广州本田现在生产3种汽车,O…

c语言程序设计工资纳税系统流程图,c语言程序设计,纳税工资系统.doc

c语言程序设计,纳税工资系统c语言程序设计,纳税工资系统第一章 课程设计目的和要求1.1 课程设计的目的C语言一直是程序设计语言的主流之一数据类型丰富、齐全。C供了整数、实数、字符、字符串等基本数据类型,还提供数组、指针、结构体等构造数据类型运算符丰富、齐全…

工程师实战:单片机裸机程序框架是怎样炼成的?

前言 前不久,我有位做测试的朋友转去做开发的工作,面试遇到了一个问题,他没明白,打电话问了我。题目大概就是:在单片机裸机开发时,单片机要处理多个任务,此时你的程序框架是怎样的呢&#xff1f…