注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

在python中使用os.major获得设备的主设备号的bug  

来自osdba   2013-12-18 09:46:21|  分类: 开发技巧 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
这两天在做测试中,发现的python的os.major函数的一个bug,发现当设备号大于一个值的时候报错。报错信息如下:

>>> import os
>>> os.stat('/dev/md1048575')
posix.stat_result(st_mode=25520, st_ino=2279789310, st_dev=5L, st_nlink=1, st_uid=0, st_gid=6, st_size=0, st_atime=1387260243, st_mtime=1387260243, st_ctime=1387260243)
>>> devno = os.stat('/dev/md1048575').st_rdev
>>> os.major(devno)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: signed integer is greater than maximum
>>> os.minor(devno)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: signed integer is greater than maximum

    
代码的原意是先通过os.stat函数找到设备的设备号,然后再通过os.major()和os.minor()函数求得主设备号和次设备号,居然报错了。 发现这个问题后,想自己写一个函数,直接从设备号求出主设备号和次设备后,原先查看内核上的资料,说是内核中的设备号中占用32bit,主设备号占用12bit,次设备号占用20bit,实测发现用户空间的stat()函数的st_rdev成员变量与内核中的设备号的定义是不一样的。在st_rdev成员是dev_t类型,此类型是一个64bit的无符号整数,其major和minor在其中的占用bit情况如下:

高位                                                         低位
{20bit:major}{12bit:minor}{12bit:minor}{12bit:major}{8bit:minor}

    
这样在python中把dev_t类型的设备号转到major和minor的函数如下所示:

def my_major(devno):
    '''
    从dev_t类型的设备号中获取主设备号
    '''
    major = ((devno >> 8) & 0xfff) | ((devno >> 32) & 0xfffff000)
    return major

def my_minor(devno):
    '''
    从dev_t类型的设备号中获取次设备号
    '''
    minor = (devno & 0xff) | ((devno >> 12) & 0xffffff00)
    return minor

    

实际上C语言中的major()函数和minor()函数是一个宏,对应gnu_dev_major()和gnu_dev_minor()函数,这两个函数是在/usr/include/x86_64-linux-gnu/sys/sysmacros.h中定义。
  评论这张
 
阅读(602)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017