python中的signal.set_wakeup_fd的理解

最近在看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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值