一、什么是信号
软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用 kill 发送软中断信号。
内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。
注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。
1. 进程对信号的处理方法
第一种方法:类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。
第二种方法:忽略某个信号,对该信号不做任何处理,就象未发生过一样。
第三种方法:对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用 signal 来指定进程对某个信号的处理行为。
------ 以上来自百度百科 ------
2. 查询信号 kill -l
3. 给进程发信号 kill -信号值 pid
二、Python signal 信号模块
1. 常见的信号类型
信号名
描述
signal.SIGHUP
连接挂断,一般是在用户终端连接结束时发出。
signal.SIGILL
非法指令,在进程试图执行一些非法指令时(比如可执行文件发生错误)发出
signal.SIGINT
终止进程(ctrl + c)
signal.SIGTSTP
暂停进程(ctrl + z)
signal.SIGKILL
特殊信号,杀死一个进程。这个不能被堵塞、处理或忽略
signal.SIGSTOP
特殊行啊,暂停一个进程。这个不能被堵塞、处理或忽略
signal.SIGQUIT
终端退出(ctrl + \)
signal.SIGTERM
终止信号,软件终止信号
signal.SIGALRM
闹钟信号,由 signal.alarm() 发起
signal.SIGCONT
继续执行暂停进程
2. 常用的方法
signal.alarm(time) 叫做闹钟或者报警器
在 time(单位秒)时间后终止程序
示例:
#!coding=utf-8
import signal
import time
signal.alarm(5)
for i in range(10):
print i
time.sleep(1)
这里面 signal.alarm(5) 是程序只执行5秒
结果如下
0
1
2
3
4
[Finished in 5.9s with exit code -14]
:在一个进程中只能设置一个 signal. alarm(time),如果设置第二个则会覆盖第一个的时间。
signal.pause() 暂停进程直到出现一个信号
signal.pause() 会把进程暂停且等待出现任何一个信号后,执行 signal.pause() 后面的语句。
示例
#!coding=utf-8
import signal
import time
signal.alarm(5)
signal.pause()
for i in range(10):
print i
time.sleep(1)
没有信号的情况下,不会执行 for 循环。而且 5 秒后自动结束。
signal.signal(sig, handler) 信号处理函数
函数
说明
参数
signal.signal(sig, handler)
信号处理函数
参数:
handler:
SIG_IGN:信号被忽略
SIG_DFL: 进程采用默认行为处理
function: 传入一个函数,自定义处理过程
SIGSTOP SIGKILL: 不能处理,只能采用
示例:无视 CTRL+C 操作
#!coding=utf-8
import signal
signal.alarm(10)
signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.pause()
在这10秒期间 CTRL+C 无效。10秒后自动关闭。
示例:函数处理信号
#!coding=utf-8
import signal
import time
def func(signum, frame):
if signum == signal.SIGALRM:
print('alarm SIGALRM 信号')
elif signum == signal.SIGINT:
print("CTRL+C SIGINT 信号")
signal.alarm(5)
signal.signal(signal.SIGINT, func)
signal.signal(signal.SIGALRM, func)
while True:
print('循环...')
time.sleep(1)