linux 不用 ioctl 的设备控制

有时控制设备最好是通过写控制序列到设备自身来实现. 例如, 这个技术用在控制台驱动 中, 这里所谓的 escape 序列被用来移动光标, 改变缺省的颜色, 或者进行其他的配置任 务. 这样实现设备控制的好处是用户可仅仅通过写数据控制设备, 不必使用(或者有时候 写)只为配置设备而建立的程序. 当设备可这样来控制, 发出命令的程序甚至常常不需要 运行在和它要控制的设备所在的同一个系统上.

例如, setterm 程序作用于控制台(或者其他终端)配置, 通过打印 escape 序列. 控制程 序可位于和被控制的设备不同的一台计算机上, 因为一个简单的数据流重定向可完成这个 配置工作. 这是每次你运行一个远程 tty 会话时所发生的事情: escape 序列在远端被打 印但是影响到本地的 tty; 然而, 这个技术不局限于 ttys.

通过打印来控制的缺点是它给设备增加了策略限制; 例如, 它仅仅当你确信在正常操作时 控制序列不会出现在正被写入设备的数据中. 这对于 ttys 只是部分正确的. 尽管一个文 本显示意味着只显示 ASCII 字符, 有时控制字符可潜入正被写入的数据中, 并且可能, 因此, 影响控制台的配置. 例如, 这可能发生在你显示一个二进制文件到屏幕时; 产生的 乱码可能包含任何东西, 并且最后你常常在你的控制台上出现错误的字体.

通过写来控制是当然的使用方法了, 对于不用传送数据而只是响应命令的设备, 例如遥控 设备.

例如, 被你们作者当中的一个编写来好玩的驱动, 移动一个 2 轴上的摄像机. 在这个驱 动里, 这个"设备"是一对老式步进电机, 它们不能真正读或写. 给一个步进电机"发送数 据流"的概念没有任何意义. 在这个情况下, 驱动解释正被写入的数据作为 ASCII 命令并 且转换这个请求为脉冲序列, 来操纵步进电机. 这个概念类似于, 有些, 你发给猫的 AT 命令来建立通讯, 主要的不同是和猫通讯的串口必须也传送真正的数据. 直接设备控制的 好处是你可以使用 cat 来移动摄像机, 而不必写和编译特殊的代码来发出 ioctl 调用.

当编写面向命令的驱动, 没有理由实现 ioctl 命令. 一个解释器中的额外命令更容易实 现并使用.

有时, 然而, 你可能选择使用其他的方法:不必转变 write 方法为一个解释器和避免 ioctl, 你可能选择完全避免写并且专门使用 ioctl 命令, 而实现驱动为使用一个特殊的 命令行工具来发送这些命令到驱动. 这个方法转移复杂性从内核空间到用户空间, 这里可 能更易处理, 并且帮助保持驱动小, 而拒绝使用简单的 cat 或者 echo 命令.

猜你喜欢

转载自www.cnblogs.com/fanweisheng/p/11141827.html