在驱动法式里, ioctl() 函数上传送的变量 cmd 是应用法式用于辨别配备驱动法式请求处置内容的值。cmd除可辨别数字外,还包括有助于处置的几种响应信息。 cmd的年夜小为 32位,共分 4 个域:
bit31~bit30 2位为 “辨别读写” 区,感化是区分是读取号令仍是写进号令。
bit29~bit16 14位为 数据年夜小 区,暗示 ioctl() 中的 arg 变量传送的内存年夜小。
bit15~bit08 8位为 “魔数 (也称为 幻数 )区,这个值用以与其它配备驱动法式的 ioctl 号令中止辨别。
bit07~bit00 8位为 辨别序号 区,是区分号令的号令挨次序号。
内审定义了 _IO() , _IOR() , IOW() 和 _IOWR() 这 4 个宏来辅佐天生下面的 cmd
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))号令码中的 “区分读写区” 里的值多是 _IOC_NONE (0值)暗示有数据传输,_IOC_READ (读), _IOC_WRITE (写) , _IOC_READ|_IOC_WRITE (双向)。
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
#define _IOC(dir,type,nr,size)
(((dir) _IOC_DIRSHIFT) |
((type) _IOC_TYPESHIFT) |
((nr) _IOC_NRSHIFT) |
((size) _IOC_SIZESHIFT))
#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)
#define _IOC_NRBITS 8
#define _IOC_TYPEBITS 8
# define _IOC_SIZEBITS 14
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)#define _IOC(dir,type,nr,size) (((dir) _IOC_DIRSHIFT) | ((type) _IOC_TYPESHIFT) | ((nr) _IOC_NRSHIFT) | ((size) _IOC_SIZESHIFT))#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)#define _IOC_NRBITS 8#define _IOC_TYPEBITS 8# define _IOC_SIZEBITS 14宏睁开后[cpp]view plaincopyprint?
#define _IO(type,nr) (((_IOC_NONE) 30) | ((0) 16)) | ((type) 8) | ((nr) 0)
#define _IO(type,nr) (((_IOC_NONE) 30) | ((0) 16)) | ((type) 8) | ((nr) 0)(dir) _IOC_DIRSHIFT) dir 往左移 30 位,即移到 bit31~bit30 两位上,取得标的目的(读写)的属性;
这几个宏的应用格局为:
_IO (魔数, 基数);
_IOR (魔数, 基数, 变量型)
_IOW (魔数, 基数, 变量型)
_IOWR (魔数, 基数,变量型 )