Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101231
  • 博文数量: 22
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 401
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-15 17:37
文章分类
文章存档

2009年(21)

2008年(1)

我的朋友

分类: C/C++

2009-03-27 17:22:44

    函数名: ioctl
  功 能: 控制I/O设备
  用 法: int ioctl(int handle, int cmd,[int *argdx, int argcx]);
  include/asm/ioctl.h中定义的宏的注释:
  #define _IOC_NRBITS 8 //序数(number)字段的字位宽度,8bits
  #define _IOC_TYPEBITS 8 //幻数(type)字段的字位宽度,8bits
  #define _IOC_SIZEBITS 14 //大小(size)字段的字位宽度,14bits
  #define _IOC_DIRBITS 2 //方向(direction)字段的字位宽度,2bits
  #define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) //序数字段的掩码,0x000000FF
  #define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) //幻数字段的掩码,0x000000FF
  #define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) //大小字段的掩码,0x00003FFF
  #define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) //方向字段的掩码,0x00000003
  #define _IOC_NRSHIFT 0 //序数字段在整个字段中的位移,0
  #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) //幻数字段的位移,8
  #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) //大小字段的位移,16
  #define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) //方向字段的位移,30
  /*
  * Direction bits.
  */
  #define _IOC_NONE 0U //没有数据传输
  #define _IOC_WRITE 1U //向设备写入数据,驱动程序必须从用户空间读入数据
  #define _IOC_READ 2U //从设备中读取数据,驱动程序必须向用户空间写入数据
  #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)
  程序例:
  #include
  #include
  #include
  int main(void) {
  ..int stat;
  /* use func 8 to determine if the default drive is removable */
  ..stat = ioctl(0, 8, 0, 0);
  ..if (!stat)
  ....printf("Drive %c is removable.\n", getdisk() + 'A');
  ..else
  ....printf("Drive %c is not removable.\n", getdisk() + 'A');
  ..return 0;
  }
   
阅读(973) | 评论(0) | 转发(0) |
0

上一篇:strsep strpbrk

下一篇:关于pt_regs

给主人留下些什么吧!~~