1 信号的基本描述

Signal信号(其全程为软中断信号)是Linux系统编程中非常重要的概念,信号是异步进程中通信的一种方式。

作用是通知进程发生了异步事件。进程之间可以调用系统来传递信号, 本身内核也可以发送信号给进程, 告诉该进程发生了某个事件.

在应用层将消息传递给内核监控,当消息处理完毕后,内核将消息反馈给应用层;这样操作不会出现阻塞等待,保持信号处理的持续性。

相对于共享内存,信号更加偏向于系统层面的,linux系统也是通过信号来管理进程的,而且系统也规定了某些进程接到某些信号后的行为。

一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。

 注意:信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

信号通信的两种情况:

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

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

2 常见信号名称、含义、默认行为

信号名称      含义                                                        默认行为

SIGINT        ctrl + c 会发送给前台的每一个进程          终止 sigint

SIGQUIT     ctrl + \                                                      终止 sigquit

SIGTSTP    ctrl + z                                                      暂停 sigtstp

SIGKILL      结束一个进程,且不能被忽略,处理        终止 sigkill

SIGALRM    时钟信号,常用作定时器                         终止 sigalrm

SIGSTOP    暂停一个进程,且不能被忽略,处理       暂停 sigstop

SIGCHLD    子进程发送给父进程信号                         忽略 sigchld


其他相对较全的信号名称,在终端上输入 kill -l

注:

(1)在信号列表中,34之后的信号尚没有定义。

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

对于SIGKILL信号,进程是不能忽略的。该信号意味不管进程正在做什么,立刻停止。

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


Linux系统有两大类信号:

第一类:POSIX标准的规则信号(regular signal 1-31编号)

第二类:实时信号(real-time signal 32-63)

注意: 由于不同系统中同一个数值对应的信号类型不一样,所以最好使用信号名称;信号的数值越小, 优先级越高。

3 信号的基本用法

kill: 用法: kill [-s 信号声明 | -n 信号编号 | -信号声明] 进程号 | 任务声明 ...  或

kill -l [信号声明]

发送信号:os.kill(pid,signal)  向pid进程(主动)发送一个signal信号

例如,os.kill(9484,9)

首先我们可以查到9对应的SIGKILL信号,也意味着向PID为9484进程发送一个SIGKILL信号,最终将其杀死。

下图查看进程的杀死过程:

第一步:创建一个进程

(创建一个终端)

$ ipython3
In [1]: while True:
   ...:     pass
   ...: 

第二步:查看进程 ps -aux

(创建一个终端)

方法1

tarena 9424 0.2 0.8 155224 24452 pts/6 Sl+ 21:12 0:00 python3 /usr/b

方法2

top 直接动态监控进程状态,当添加或杀死一个进程时,可以实时查看到

一般新创建的进程PID数值较大,位于最下方

第三步:杀死信号

(创建一个终端)

方法1: ipyton3

方法2:创建py文件

import os
os.kill(9424,9)

运行后会在步骤1终端上直接显示“已杀死”

参考:

初步理解Python进程的信号通讯

Linux信号基础

Python和Signal

python学习笔记——多进程间通信——Linux信号基础的更多相关文章

  1. python学习笔记五 模块上(基础篇)

    模块学习 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...

  2. python学习笔记六 面向对象相关下(基础篇)

    面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以将多函数中公用的变量封装到对象中) 对象,根据模板创建的 ...

  3. python学习笔记三 文件操作(基础篇)

    文件操作 打开文件 open(name[,mode[,buffering]])   open函数使用一个文件名作为强制参数,然后返回一个文件对象.[python 3.5 把file()删除掉]   w ...

  4. Python学习笔记整理总结【语言基础篇】

    一.变量赋值及命名规则① 声明一个变量及赋值 #!/usr/bin/env python # -*- coding:utf-8 -*- # _author_soloLi name1="sol ...

  5. Python学习笔记(一):基础知识

    一.什么是python? python是一种面向对象.解释型的计算机语言,它的特点是语法简洁.优雅.简单易学 二.编译型语言和解释型语言 编译型语言就是把程序编译成计算机语言然后执行,(一次编译到处运 ...

  6. python学习笔记-(十)面向对象基础

    面向对象相关知识简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...

  7. python学习笔记五 模块下(基础篇)

    shevle 模块 扩展pickle模块... 1.潜在的陷进 >>> import shelve>>> s = shelve.open("nb" ...

  8. Python学习笔记整理总结【web基础】【web/HTML/CSS/JavaScript/DOM/jQuery】

    一.HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以 ...

  9. python学习笔记(二):基础知识点

    python基本元素 7 // 2 3 7 % 3 1 # 取商以及余数 divmod(7,3) (2, 1) 1j*1j (-1+0j) 10/3 3.3333333333333335 '3,''1 ...

随机推荐

  1. [3] 球(Sphere)图形的生成算法

    顶点数据的生成 bool YfBuildSphereVertices ( Yreal radius, Yuint slices, Yuint stacks, YeOriginPose originPo ...

  2. require.js 最佳实践

    require.js是一个js库,相关的基础知识,前面转载了两篇博文:Javascript模块化编程(require.js), Javascript模块化工具require.js教程,RequireJ ...

  3. 倒计时 总结 Timer Handler CountDownTimer RxJava MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. 动态图片 Movie android-gif-drawable GifView

    Movie 类 文档位置:/sdk/docs/reference/android/graphics/Movie.html 官方对这个类连一句介绍都没有,并且所有的方法也没有一行注释,可见多么不受重视! ...

  5. Restful安全认证及权限的解决方案

    一.Restful安全认证常用方式 1.Session+Cookie 传统的Web认证方式.需要解决会话共享及跨域请求的问题. 2.JWT JSON Web Token. 3.OAuth 支持两方和三 ...

  6. c#写扩展方法

    学习MVC时,学会了写扩展方法,用起来很方便. 01 using System; 02 using System.Collections.Generic; 03 using System.Linq; ...

  7. vue组件级路由钩子函数介绍,及实际应用

    正如其名,vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消. 有多种方式可以在路由导航发生时执行钩子:全局的.单个路由独享的.或者组件级的. 一.全局钩子 你可以使用 rout ...

  8. GO语言基础之并发concurrency

    并发Concurrency 很多人都是冲着 Go 大肆宣扬的高并发而忍不住跃跃欲试,但其实从源码的解析来看,goroutine 只是由官方实现的超级“线程池”而已.不过话说回来,每个实例 4-5KB的 ...

  9. 如何使用Octave 在Ubuntu上科学处理音频

    Octave 是一个类似于 Linux 上的 Matlab 的软件,它拥有数量众多的函数和命令,支持声音采集.记录.回放以及音频信号的数字化处理,用于娱乐应用.研究.医学以及其它科学领域.在本教程中, ...

  10. 内有干货!2个人3个月怎样从零完毕一款社区App《林卡》

    嘿,大家好.我是不灭的小灯灯,我赌5毛你没听说过我的名字... 好啦.这篇不是鸡汤,是经验吐槽.干货分享! 所以乱七八糟的就不多说了.直接切入正题. 先说下自己的情况背景,眼下尚未毕业.非计算机专业, ...