ioctl头文件中特虎的地方

Surpring point: 1 _IOC_TYPECHECK的写法。2 对32位cmd定义的macro类型。

介绍之前先说下32位的cmd被分为4块,不罗嗦,直接看宏便知道了。

#define _IOC_NRBITS  8
#define _IOC_TYPEBITS 8
#define _IOC_SIZEBITS 14
#define _IOC_DIRBITS 2

#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)

#define _IOC_NRSHIFT 0
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)

上面包括  nr占8位, type占8位, size占14位, dir(操作)占2位。各个的掩码,偏移,全部都定义为一个macro。

 

1 _IOC_TYPECHECK(t)的写法

#define _IOC_TYPECHECK(t) \
(sizeof(t) == sizeof(t[1]) && \
sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
sizeof(t) < __invalid_size_argument_for_IOC

【精辟】其中t应当为一个类型,比如t为int, int[10], struct类型。type[1]类型和type的sizeof是一样的。
其次只有type类型的大小,14位所能表达的大小才成功。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值