信号的概念

信号的概念

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

几个常用信号:

SIGINT     终止进程  中断进程  (control+c)

SIGTERM   终止进程     软件终止信号

SIGKILL   终止进程     杀死进程

SIGALRM 闹钟信号

进程结束信号 SIGTERM和SIGKILL的区别

SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。

对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里。

发送信号一般有两种原因:

1(被动式)  内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号

2(主动式)  通过系统调用kill来向指定进程发送信号

操作系统规定了进程收到信号以后的默认行为

但是,我们可以通过绑定信号处理函数来修改进程收到信号以后的行为

有两个信号是不可更改的SIGTOP和SIGKILL

绑定信号处理函数

import os
import signal
from time import sleep  

def onsignal_term(a,b):
    print ‘收到SIGTERM信号‘  

#这里是绑定信号处理函数,将SIGTERM绑定在函数onsignal_term上面
signal.signal(signal.SIGTERM,onsignal_term)  

def onsignal_usr1(a,b):
    print ‘收到SIGUSR1信号‘
#这里是绑定信号处理函数,将SIGUSR1绑定在函数onsignal_term上面
signal.signal(signal.SIGUSR1,onsignal_usr1)  

while 1:
    print ‘我的进程id是‘,os.getpid()
    sleep(10)  

运行该程序。然后通过另外一个进程来发送信号。

发送消息的代码如下:

import os
import signal  

#发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改
os.kill(16175,signal.SIGTERM)
#发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改
os.kill(16175,signal.SIGUSR1) 

使用信号需要特别注意的地方

如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。

所以,尽量不要在多线程中使用信号。

这个不妥,测试没发现有信号丢失

例子演示:

接收信号的程序,你会发现如果有另外一端使用多线程向这个进程发送信号,会遗漏一些信号。

时间: 02-12

信号的概念的相关文章

linux信号基本概念及如何产生信号

linux信号基本概念及如何产生信号 摘自:https://blog.csdn.net/summy_j/article/details/73199069 2017年06月14日 09:34:21 阅读数:4131 标签: linux信号 更多 个人分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/summy_J/article/details/73199069 阅前须知 本文的主要内容有: 1.信号的基本概念(包括进程对信号的3

10.2信号的概念

首先,每一个信号都有一个名字,这些名字都是使用相同的三个字母SIG 开始的.举例来说,SIGABRT是当进程调用数abort的时候生成的终止信号.SIGALRM是当函数alaram设置的定时时间到的时候生成的alarm信号.版本7已经有了15中信号:SVR4以及4.4BSD有31种不同的信号,FreBSD 8.0支持32中不同的信号:Mac OS X10.6.8以及Linux3.2.0各支持31中不同的信号:同时Solaris 10支持40中不同的信号.此外,FreeBSD,Linux以及Sol

[学习笔记]信号基本概念(中断和信号)/名称及常用信号/信号处理/signal函数实践

1基本概念 中断 q  中断是系统对于异步事件的响应 q  中断信号 q  中断源 q  现场信息 q  中断处理程序 q  中断向量表 异步事件的响应:进程执行代码的过程中可以随时被打断,然后去执行异常处理程序 生活中的中断和计算机系统中的中断 1)  无中断生活场景 张三看书,厨房烧水 2)有中断的生活场景 张三看书,设置闹钟,厨房烧水. 闹钟发出中断信号,张三把书合好(第20页),去厨房把开水事情处理好,张三重新打开20页进行阅读. 3)计算机系统的中断场景 中断源发出中断信号,CPU判断

一、进程与信号之信号的概念

信号:进程与进程之间通讯机制 信号是软件中断 信号是异步事件 信号来源:内核产生,常用信号kill(),raise(),alarm(),settimer()等 kill -l 查看linux所有 信号共64个 1-31 非实时信号发送信号可能回丢失,不支持信号排队 32-64实时信号 进程处理信号: 忽略信号 SIGKILL和SIGSTOP永远不能被忽略 忽略硬件异常 进程启动时SIGUSER1和SIGUSER2两个信号被忽略 执行默认操作 每个信号都有默认动作,大部分信号动作是终止信号 捕获信

信号(一)---信号的概念

信号是进程间可以用来相互通信的一种低级方法,是Linux系统中非常重要的内容.每个信号都有一个信号名,信号名的本质就是一个整型值,所有的信号名对应的信号值都定义在头文件<signal.h>中或者可以通过 kill 命令加上 -l 选项来查看.Linux系统中支持31种不同的信号,编号从 1 到 31 (信号编号为0有特殊意义,Linux中称为空信号),每种信号都有其不同的意义,如下图所示 注意:在使用信号的时候尽量使用信号名,而不要使用信号编号,这是因为有些信号在不同的系统中的编号可能是不同的

UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数

信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止. ? 1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了abort函数时,都会产生一个SIGABRT信号. 每一个信号对应一个正整数,定义在头文件<signal.h>中. 没有信号对应整数0,kill函数使用信号编号0表示一种特殊情况,所以信号编号0又叫做空信号(null signal). 下面的各种情况会产生一个信号: 当用户在终端按下特定的键时,会产生

python signal(信号)

信号的概念 信号(signal)--     进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT     终止进程  中断进程  (control+c) SIGTERM   终止进程     软件终止信号 SIGKILL   终止进程     杀死进程 SIGALRM 闹钟信号 进程结束信号 SIGTERM和SIGKILL的区别 SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序.在关闭程序之前,您可以结

与频谱有关的几个谱的概念

频谱.幅度谱.功率谱和能量谱 在信号处理的学习中,有一些与谱有关的概念,如频谱.幅度谱.功率谱和能量谱等,常常让人很糊涂,搞不清其中的关系.这里主要从概念上厘清其间的区别. 对一个时域信号进行傅里叶变换,就可以得到的信号的频谱,信号的频谱由两部分构成:幅度谱和相位谱.这个关系倒还是简单.那么,什么是功率谱呢?什么又是能量谱呢?功率谱或能量谱与信号的频谱有什么关系呢? 要区分功率谱和能量谱,首先要清楚两种不同类型的信号:功率信号和能量信号.我们从一个具体的物理系统来引出能量信号和功率信号的概念.已

Linux之信号第二谈

重提信号概念 前一篇中提到了信号的概念,并且对信号的产生及一些属性有了一定的认识,这一次,要从更加深入的角度看待信号. 之前提到过,当我的进程在接收到信号之前,就已经知道了,当我接收到某种信号之后就要发生某一项动作,换句话说,在进程内部,一定存在这某种结构,将这些信息都记录了下来,很明显,对于进程而言,这些信息都会保存在它的PCB当中. 首先我们来认识这样几个概念: 信号递达(Delivery):执行信号的处理动作: 信号未决(Pending):信号从产生到递达之间的状态: 阻塞(Block):