2005-03-10

在Python中接收和处理信号量

今天写程序,用到了信号量,做一下下笔记:
#!/usr/bin/env python
# sig.py
# signal test
import time
import signal
import sys

NEEDEXIT=False
def SignalHandler(sig, id):
global NEEDEXIT
if sig == signal.SIGUSR1:
print 'received signal USR1'
elif sig == signal.SIGHUP:
print 'received signal HUP'
elif sig == signal.SIGTERM:
print 'received SIGTERM, shutting down'
NEEDEXIT = True

signal.signal(signal.SIGUSR1, SignalHandler)
signal.signal(signal.SIGHUP, SignalHandler)
signal.signal(signal.SIGTERM, SignalHandler)

while 1:
if NEEDEXIT:
sys.exit()
time.sleep(1)

在我的debian上,可以使用的信号量:
0$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 33) SIGRTMIN 34) SIGRTMIN+1
35) SIGRTMIN+2 36) SIGRTMIN+3 37) SIGRTMIN+4 38) SIGRTMIN+5
39) SIGRTMIN+6 40) SIGRTMIN+7 41) SIGRTMIN+8 42) SIGRTMIN+9
43) SIGRTMIN+10 44) SIGRTMIN+11 45) SIGRTMIN+12 46) SIGRTMIN+13
47) SIGRTMIN+14 48) SIGRTMIN+15 49) SIGRTMAX-15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

启动一下程序,测试一下:
0$ python sig.py &
[1] 29465
0$ kill -1 29465
received signal HUP
0$ kill -SIGHUP 29465
received signal HUP
0$ kill -10 29465
received signal USR1
0$ kill -SIGUSR1 29465
received signal USR1
0$ kill -15 29465
received SIGTERM, shutting down
0$
[1]+ Done python sig.py
0$

程序还是挺配合的 :) 这样以后就可以直接用 kill PID 来让我的程序“协议”退出了,哈哈。

3 条评论:

匿名 说...

不知道为什么我在win下使用信号量却没有反应,必须是非win平台才可以吗?

xyb 说...

信号量是unix like的操作系统的概念,windows下是不能使用的。

匿名 说...

Who knows where to download XRumer 5.0 Palladium?
Help, please. All recommend this program to effectively advertise on the Internet, this is the best program!