信号
进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。操作系统规定了进程收到信号以后的默认行为,但是,我们可以通过绑定信号处理函数来修改进程收到信号以后的行为,有两个信号是不可更改的SIGTOP和SIGKILL。
发送信号一般有两种原因
- (被动式) 内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号
- (主动式) 通过系统调用kill来向指定进程发送信号
几个常用信号:
|
|
|
SIGINT |
终止进程 |
中断进程 (control+c) |
SIGTERM |
终止进程 |
软件终止信号 |
SIGKILL |
终止进程 |
杀死进程 |
SIGALRM |
闹钟信号 |
|
Python中Signal的用法
signal包的核心是使用signal.signal()函数来预设(register)信号处理函数
绑定信号处理函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import os import signal from time import sleep def onsignal_term(a,b): print '收到SIGTERM信号' signal.signal(signal.SIGTERM,onsignal_term) def onsignal_usr1(a,b): print '收到SIGUSR1信号' signal.signal(signal.SIGUSR1,onsignal_usr1) while 1: print '我的进程id是',os.getpid() sleep(10) 运行该程序。然后通过另外一个进程来发送信号。 import os import signal os.kill(16175,signal.SIGTERM) os.kill(16175,signal.SIGUSR1)
|
signal.alarm()
它被用于在一定时间之后,向进程自身发送SIGALRM信号
在signal.alarm()执行5秒之后,进程将向自己发出SIGALRM信号,随后,信号处理函数myHandler开始执行。
1 2 3 4 5 6 7 8 9 10
| import signal def myHandler(signum, frame): print("Now, it's the time") exit() signal.signal(signal.SIGALRM, myHandler) signal.alarm(5) while True: print('not yet')
|