最近在看tornado的源码,看到好几次signal.set_wakeup_fd(fd)这个函数.
这个函数简单的理解就是触发到signal时,会往fd中写入’\0’.
找了个简单的例子自己增加了部分实现和注释,从例子中能够更容易的理解这个函数.
代码
#!/usr/bin/env python
# encoding: utf-8
import select
import signal
import fcntl
import os
pipe_r, pipe_w = os.pipe()
#r_fd_obj = os.fdopen(r, "rb", 0) #0 means unbuffered,1是默认buffer数字,具体的数字就是相应数量byte的buffer
#r_fd = i_fd_obj.fileno()
flags = fcntl.fcntl(pipe_w, fcntl.F_GETFL, 0)
flags = flags | os.O_NONBLOCK
flags = fcntl.fcntl(pipe_w, fcntl.F_SETFL, flags)
signal.set_wakeup_fd(pipe_w)
# Mask out signal handler
#不设置这个的话,就会运行SIGALRM默认的handler,会打印 alarm clock,然后退出
signal.signal(signal.SIGALRM, lambda x,y: None) #signal.signal(signalnum, handler)
# Set up a signal to repeat every 2 seconds
#signal.ITIMER_REAL :Decrements interval timer in real time, and delivers SIGALRM upon expiration.
#signal.setitimer(which, seconds[, interval]),The interval timer specified by which can be cleared by setting seconds to zero.
signal.setitimer(signal.ITIMER_REAL, 2, 2)
poller = select.epoll()
poller.register(pipe_r, select.EPOLLIN)
print "start"
while True:
try:
events = poller.poll()
for fd, flags in events:
print "receive Signal"
print fd, flags
# read a single event
#os.read(fd, n),Read at most n bytes from file descriptor fd.
#Return a string containing the bytes read.
#If the end of the file referred to by fd has been reached, an empty string is returned.
print os.read(pipe_r, 1)
except IOError:
pass