python中的signal.set_wakeup_fd的理解

来源:互联网 发布:新西兰羊毛被品牌知乎 编辑:程序博客网 时间:2024/06/04 19:36
最近在看tornado的源码,看到好几次signal.set_wakeup_fd(fd)这个函数.  

这个函数简单的理解就是触发到signal时,会往fd中写入’\0’.
找了个简单的例子自己增加了部分实现和注释,从例子中能够更容易的理解这个函数.

代码

#!/usr/bin/env python# encoding: utf-8import selectimport signalimport fcntlimport ospipe_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_NONBLOCKflags = 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

0 0
原创粉丝点击