ioctl中宏定义的理解(二)

780阅读 0评论2013-04-13 garfield_trump
分类:LINUX

 

#define _IOC(dir,type,nr,size) \

    (((dir)  << _IOC_DIRSHIFT)  | \

     ((type)   << _IOC_TYPESHIFT) | \

     ((nr)   << _IOC_NRSHIFT)   | \

     ((size)   << _IOC_SIZESHIFT))

这里将四个段根据偏移组合成一个三十二位的值

/*

* used to create numbers 

*/

//构造无参数的命令编号

#define _IO(type,nr)        _IOC(_IOC_NONE,(type),(nr),0) 

//构造从驱动程序中读取数据的命令编号

#define _IOR(type,nr,size)    _IOC(_IOC_READ,(type),(nr),sizeof(size)) 

//用于向驱动程序写入数据命令

#define _IOW(type,nr,size)    _IOC(_IOC_WRITE,(type),(nr),sizeof(size))

//用于双向传输

#define _IOWR(type,nr,size)      _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))

这部分实现的是构造不同用处下的命令编号

/* 

* used to decode ioctl numbers..

*/

//从命令参数中解析出数据方向,即写进还是读出

#define _IOC_DIR(nr)        (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)

//从命令参数中解析出幻数type

#define _IOC_TYPE(nr)       (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)

//从命令参数中解析出序数number

#define _IOC_NR(nr)        (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)

//从命令参数中解析出用户数据大小

#define _IOC_SIZE(nr)       (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)

实现从命令参数中提取对应字段的值

/* ...and for the drivers/sound files... */

#define IOC_IN            (_IOC_WRITE << _IOC_DIRSHIFT)

#define IOC_OUT              (_IOC_READ << _IOC_DIRSHIFT)

#define IOC_INOUT                ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)

#define IOCSIZE_MASK            (_IOC_SIZEMASK << _IOC_SIZESHIFT)

#define IOCSIZE_SHIFT           (_IOC_SIZESHIFT)

生成对应的字段的数值和掩码

上一篇:服务器TCP连接的状态与并发性的探究
下一篇:ioctl中宏定义的理解(一)