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