linux的ioctl函数

在调用ioctl的时候。已经指定了一个文件描述符了吗,也就是说,已经指定了要用某个设备文件节点本身驱动中提供的ioctl方法,但是为什么在设定CMD命令的时候,还要用这么多的宏定义来制定CMD,网上书上说是与其他设备驱动中的ioctl的CMD命令进行区分。这个意义在哪儿?我知道肯定有意义,但是就目前来看我不懂为什么要这样做。 明明用户做ioctl调用的时候就指定了文件描述符了,为啥还要"与其他设备的CMD进行区别"????
全部评论
我觉得:1 内核开发者可以使用宏来定义新的命令,这个命令可以避免别的预留的命令(在VFS层使用的,比如说你提到的0,1,2这些)产生冲突。 2 使用宏比使用直接的数字更容易不出错,无论是内核的开发者,还是这个设备的使用者,这个跟其他系统调用如kill,signal这些是一个道理。 3 的确你自己定义的文件,随便你写什么命令都可以,与其他类型的文件冲突也没关系,只要不与VFS层的冲突就可以了,也不需要专门定义宏。 4 还要考虑到linux不只有x86一个平台的,同一套iotcl需要跟不同的处理器兼容,直接使用数字的话在处理诸如大小端这类问题很麻烦,而且有些命令在不同的平台上值是不一样的(如_IOC_NONE在sparc上是1,而一般为0),为什么要这样取值我也不知道,详细可以研究相关的处理器架构或者ioctl代码。其实你看看这些宏的定义就清楚了。 5 最后摘抄一段源码的注释: /* ioctl command encoding: 32 bits total, command in lower 16 bits,   5  * size of the parameter structure in the lower 14 bits of the   6  * upper 16 bits.   7  * Encoding the size of the parameter structure in the ioctl request   8  * is useful for catching programs compiled with old versions   9  * and to avoid overwriting user space outside the user buffer area.  10  * The highest 2 bits are reserved for indicating the ``access mode''.  11  * NOTE: This limits the max parameter size to 16kB -1 !  12  */ /*   5  * The original linux ioctl numbering scheme was just a general   6  * "anything goes" setup, where more or less random numbers were   7  * assigned.  Sorry, I was clueless when I started out on this.   8  *   9  * On the alpha, we'll try to clean it up a bit, using a more sane  10  * ioctl numbering, and also trying to be compatible with OSF/1 in  11  * the process. I'd like to clean it up for the i386 as well, but  12  * it's so painful recognizing both the new and the old numbers..  13  */
点赞
送花
回复 分享
发布于 2016-09-06 09:23
希望各路大神帮我解答一下。
点赞
送花
回复 分享
发布于 2016-09-05 23:54
国泰君安
校招火热招聘中
官网直投
同一个fd可以有多种命令,例如摄像头设备,open获取fd,可以用ioctl对这个fd进行查询,摄像,停止等操作,就要用ioctl的不同命令
点赞
送花
回复 分享
发布于 2016-09-06 00:11

相关推荐

1. 关键字static的作用是什么?2. 关键字const是什么含意?3. 关键字volatile有什么含意,并给出三个不同的例子。4. "引用"与指针的区别是什么?5. .h头文件中的ifndef/define/endif的作用?6. 描述实时系统的基本特性。7. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?8. 全局变量和静态全局变量的区别。9. 数组与链表的区别。10. 什么是平衡二叉树?11. 堆栈溢出一般是由什么原因导致的?12. 冒泡排序算法的时间复杂度是什么?13. 什么函数不能声明为虚函数?14. 队列和栈有什么区别?15. 不能做switch()的参数类型。16. 局部变量能否和全局变量重名?17. 如何引用一个已经定义过的全局变量?18. 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?19. 语句for(;;)是什么意思?20. do...while和while...do有什么区别?21. static全局变量、局部变量、函数与普通全局变量、局部变量、函数的区别。22. 程序的内存分配。23. 进程与线程的区别。24. 解释堆和栈的区别。25. 什么是预编译,何时需要预编译。26. 三种基本的数据模型。27. 结构与联合有什么区别?28. 描述内存分配方式以及它们的区别。29. const与#define相比,有何优点?30. 简述数组与指针的区别。面经地址在下方  c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
查看30道真题和解析
点赞 评论 收藏
分享
答辩完非常忐忑的等了一周终于来正式转正的offer了鼠鼠的实习offer是通过七牛云去年办的大学生1024获得的,当时真的很卷,300多组抢8个名额这个机会真的很难得。然后就在12月份入职了,前三个月参加的是实训营,开发的任务分成了两个方向,一个是做Go+的社区,一个是做Go+的少儿平台,因为我是前端同学入职的,感觉社区做的难度不大,所以选择了参与二组。在日常开发中就是一个一个pr进行迭代,每次在提交之后都会有导师对你的这次pr进行code review。(导师真的很严格),在接口设计的阶段,导师不会很简单的告诉你某个接口应该怎么设计,而是会带着你去思考这个东西从需求开始,他是为了什么?在未来他的职责是否会有变化?现在这么设计,是否会导致未来一定问题的发生?关于这方面的讨论真的太多太多了。在每周五的时候也都会有导师的code review分享,总结一周发现的问题。(ps:寒星老师的声音真的好好听 https://b23.tv/HrjFUUG )后三个月,基本上所有通过实训的同学都去了业务部门,我和导师们沟通下来,决定继续参与到Go+这个语言本身的开发。参与了go+的vscode插件,语言服务器,包管理站点,以及Go+语言本身的开发,这个阶段带我的老师是liteide的作者真的很荣幸能和那么多大佬接触,刚刚开始老师也会给我单独拉课尽可能的同步语言开发方向的知识。这个阶段的开发其实算是走出了我自己的舒适圈,看到之前根本看不到的知识。然后在答辩中我也明确了我未来的方向,也选择继续参与Go+的开发,接触更底层的知识。在准备答辩的时候差不多有两周时间,一直会很紧张,导师也会一直跟我说我已经足够好了,让我放下焦虑
投递七牛云等公司7个岗位
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务