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位所能表达的大小才成功。

posted @ 2011-10-27 19:42  Jack204  阅读(808)  评论(0编辑  收藏  举报