Chinaunix首页 | 论坛 | 博客
  • 博客访问: 93769
  • 博文数量: 15
  • 博客积分: 416
  • 博客等级: 一等列兵
  • 技术积分: 169
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-15 15:03
文章分类

全部博文(15)

文章存档

2012年(12)

2006年(3)

我的朋友

分类: Python/Ruby

2012-07-28 11:42:38


在使用poll()后返回轮询对象,该对象支持以下方法:
pollObj.register(fd,[,eventmask])第一个参数是注册新的文件描述符fd,fd要么是一个整数文件描述符,要么可以带有一个获取文件描述符的fileno()方法的对象。eventmask是一些按位或标记,这些标记指示要处理的事件。

POLLIN:       用于读取数据
POLLPRI:      用于读取紧急数据
POLLOUT:      准备写入
POLLERR:      错误情况
POLLHUP:      保持状态
POLLNVAL:     无效请求

最后在循环中利用pollObj.poll()来进行对已注册的文件描述符进行轮询。返回一元祖(fd,event)。其中fd是文件描述符,event是指示时间的位掩码。至需要将event与对应的时间进行&测试即可。

利用poll创建对一个多路文件复制程序,代码如下:


点击(此处)折叠或打开

  1. #!/usr/bin/env python


  2. import select
  3. BLKSIZE=8192

  4. def readwrite(fromfd,tofd):
  5.     readbuf = fromfd.read(BLKSIZE)
  6.     if readbuf:
  7.         tofd.write(readbuf)
  8.         tofd.flush()
  9.     return len(readbuf)

  10. def copyPoll(fromfd1,tofd1,fromfd2,tofd2):
  11.    #定义需要监听的事件
  12.     READ_ONLY = (select.POLLIN |
  13.              select.POLLPRI |
  14.             select.POLLHUP |
  15.             select.POLLERR )
  16.     totalbytes=0
  17.     
  18.         if not (fromfd1 or fromfd2 or tofd1 or tofd2) :
  19.         return 0
  20.     fd_dict = {fromfd1.fileno():fromfd1,fromfd2.fileno():fromfd2}
  21.     #创建poll对象p
  22.     p=select.poll()
  23.     #利用poll对象p对需要监视的文件描述符进行注册
  24.     p.register(fromfd1,READ_ONLY)
  25.     p.register(fromfd2,READ_ONLY)
  26.     while True:
  27.   #轮询已经注册的文件描述符是否已经准备好
  28.         result = p.poll()
  29.         if len(result) != 0:
  30.             for fd,events in result:
  31.                 if fd_dict[fd] is fromfd1:
  32.                     if events & (select.POLLIN|select.POLLPRI):
  33.                         bytesread = readwrite(fromfd1,tofd1)
  34.                         totalbytes+=bytesread
  35.     
  36.                     elif events & (select.POLLERR):
  37.                         p.unregister(fd_dict[fd])
  38.             
  39.                 if fd_dict[fd] is fromfd2:
  40.                     if events & (select.POLLIN|select.POLLPRI):
  41.                         bytesread = readwrite(fromfd2,tofd2)
  42.                         totalbytes+=bytesread
  43.                     elif events & (select.POLLERR):
  44.                         p.unregister(fd_dict[fd])
  45.         if bytesread <= 0:    
  46.             break
  47.     return totalbytes
  48.     
  49. def main():
  50.     
  51.     fromfd1 = open("/etc/fstab","r")
  52.     fromfd2 = open("/root/VMwareTools-8.8.1-528969.tar.gz","r")

  53.     tofd1 = open("/root/fstab","w+")
  54.     tofd2 = open("/var/passwd","w+")

  55.     totalbytes = copyPoll(fromfd1,tofd1,fromfd2,tofd2)
  56.     print "Number of bytes copied %d\n" % totalbytes
  57.     return 0
  58.     


  59. if __name__=="__main__":
  60.     main()

阅读(6641) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~