ioctl 的 scull 实现只传递设备的配置参数, 并且象下面这样容易: switch(cmd)

{

case SCULL_IOCRESET:

scull_quantum = SCULL_QUANTUM; scull_qset = SCULL_QSET; break;

case SCULL_IOCSQUANTUM: /* Set: arg points to the value */ if (! capable (CAP_SYS_ADMIN))

return -EPERM;

retval = get_user(scull_quantum, (int user *)arg); break;

case SCULL_IOCTQUANTUM: /* Tell: arg is the value */ if (! capable (CAP_SYS_ADMIN))

return -EPERM; scull_quantum = arg; break;

case SCULL_IOCGQUANTUM: /* Get: arg is pointer to result */ retval = put_user(scull_quantum, (int user *)arg); break;

case SCULL_IOCQQUANTUM: /* Query: return it (it's positive) */
return scull_quantum;

case SCULL_IOCXQUANTUM:
/* eXchange: use arg as pointer */ if (! capable (CAP_SYS_ADMIN))

return -EPERM; tmp =
scull_quantum;

retval =  
get_user(scull_quantum, (int  
user *)arg);

if (retval == 0)

retval =  
put_user(tmp, (int   user *)arg);

break;

case SCULL_IOCHQUANTUM:
/* sHift: like Tell + Query */ if (! capable (CAP_SYS_ADMIN))

return -EPERM;

tmp = scull_quantum; scull_quantum = arg; return tmp;

default: /* redundant, as
cmd was checked against MAXNR */ return -ENOTTY;

}

return retval;

scull 还包含 6 个入口项作用于 scull_qset. 这些入口项和给 scull_quantum
的是一 致的, 并且不值得展示出来.

从调用者的观点看(即从用户空间), 这 6 种传递和接收参数的方法看来如下: int quantum;

ioctl(fd,SCULL_IOCSQUANTUM,
&quantum);  /* Set by pointer */

ioctl(fd,SCULL_IOCTQUANTUM, quantum);  /* Set by value */ ioctl(fd,SCULL_IOCGQUANTUM, &quantum); /* Get by pointer */ quantum =
ioctl(fd,SCULL_IOCQQUANTUM);           /*
Get by return value */ ioctl(fd,SCULL_IOCXQUANTUM, &quantum); /* Exchange by pointer */

quantum =
ioctl(fd,SCULL_IOCHQUANTUM, quantum); /* Exchange by value */

当然, 一个正常的驱动不可能实现这样一个调用模式的混合体. 我们这里这样做只是为了 演示做事情的不同方式. 但是, 正常地, 数据交换将一致地进行, 通过指针或者通过值, 并且要避免混合这 2 种技术.

最新文章

  1. outlook2013 更改邮件文件位置
  2. Jade之Mixins
  3. RDLC直接打印帮助类
  4. 编程第一个Apple Watch程序创建项目
  5. grails-shiro权限认证
  6. 为php安装memcached扩展连接memcached服务器
  7. 函数lock_rec_create
  8. HDU 2181 哈密顿绕行世界问题 (DFS)
  9. Nand flash 的发展和eMMC
  10. 关于CodeReview(java)(转)
  11. GridView网格线都设置
  12. tnvm 安装模块不能找到关联模块问题
  13. Python 项目实践二(生成数据)第二篇之随机漫步
  14. IOS 使用cocoapods后无法导入头文件问题
  15. 面向对象原生JavaScript案例炫彩小球
  16. REST API TO MiniProgram 上线WordPress官方插件库
  17. [转]RPA流程自动化-Blueprism认证考试介绍
  18. dbeaver导出MySQL的架构提示"IO Error: Utility 'mysqldump.exe' not found in client home 'MySQL Connector/Net"解决方案
  19. 使用虚拟化KVM安装RHEL7系统
  20. Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目

热门文章

  1. maven的配置和使用
  2. 纯CSS3绘制的黑色图标按钮组合
  3. 邀您共赴数据库学术顶会ICDE 2019——阿里云专场 零距离接触达摩院数据库“最强大脑”
  4. Inno Setup生成桌面快捷方式
  5. mariadb配置文件优化参数
  6. dva框架简单描述使用
  7. Android横竖屏切换和灭屏亮屏时Activity的生命周期探究(1)
  8. Python基础:08列表解析与生成器表达式
  9. CentOs7.0安装scrapy (云服务器上)
  10. mysql数据库之去重