https://docs.python.org/zh-cn/3/library/signal.html#module-signal
signal
--- 设置异步事件处理程序
1、信号
【1】 一个进程向另外一个进程通过信号的方式传递某种讯息。
【2】接收方在接收到信号后作出相应的处理。
2、信号名称
系统定义,名字或者数字
3、信号含义
系统定义,信号的作用
e.g: kill -l
SIGHUP 断开连接
SIGINT ctrl-c
SIGQUIT ctrl-\
SIGTSTP ctrl-z
SIGKILL 终止进程且不能被处理
SIGSTOP 暂停进程且不能被处理
SIGALRM 时钟信号
SIGCHLD 子进程状态改变发送给父进程信息号
4、信号默认处理方法
当一个进程接收到信号时,默认产生的效果。(终止进程、暂停进程、忽略发生)
python信号处理
程序的同步执行和异步执行
【1】同步 : 程序按照步骤一步一步执行,呈现一个先后性和顺序性
【2】异步 : 程序在执行中利用内核功能帮助完成必要的辅助操作,不影响应用层持续执行
1、os.kill(pid,sig)
功能 : 发送一个信号给某个进程
参数 : pid, 给哪个进程发送信号
sig,具体要发送的信号
2、signal.alarm(sec)
功能: 设置时钟信号, 在一定时间后给自身发送SIGALRM信号
参数: sec 时间(秒)
① 一个进程中只能有一个时钟,后来的时候会覆盖前面的时间
② windows上signal模块没有此方法
3、signal.pause()
功能: 阻塞进程,等待一个信号
4、signal.signal(sig,handler)
功能 : 处理信号
参数 : sig, 要处理的信号
handler, 信号处理方法
可选值 : SIG_DFL, 表示使用默认方法处理
SIG_IGN, 表示忽略这个信号
func ,自定义函数
自定义函数格式 :
def func(sig,frame)
sig , 接收到的信号
frame,信号结构对象
【1】signal函数也是一个异步处理函数。只要执行了该函数,则进程任意时候接收到相应信号都会处理。
【2】signal 是不能处理 SIGKILL SIGSTOP的
【3】父进程中可以用 signal(SIGCHLD,SIG_IGN)将子进程的退出交给系统处理
【4】信号是一种异步的进程间通信方法
import signal
from time import sleep
signal.alarm(5)
#使用默认的方法处理信号
# signal.signal(signal.SIGALRM,signal.SIG_DFL)
#使用忽略信号的方法处理
signal.signal(signal.SIGALRM,signal.SIG_IGN)
signal.signal(signal.SIGINT,signal.SIG_IGN)
while True:
sleep(2)
print("摁ctrl-c")
print("等待时钟....")
from signal import *
import time
def handler(sig,frame):
if sig == SIGALRM:
print("收到时钟信号")
elif sig == SIGINT:
print("就不结束")
alarm(5)
signal(SIGALRM,handler)
signal(SIGINT,handler)
while True:
print("Waiting for a signal")
time.sleep(2)