替换 ioctl() 函数
Posted
技术标签:
【中文标题】替换 ioctl() 函数【英文标题】:Replacement for the ioctl() function 【发布时间】:2011-09-03 17:35:49 【问题描述】:我正在为小型微控制器应用程序开发设备驱动程序 I/O 模型,使用 POSIX 作为接口设计指南。我将ioctl()
实现为一种控制驱动程序/硬件参数的方法——例如UART 波特率、I2C 从地址等。
我注意到,POSIX:2008 将ioctl()
和<stropts.h>
列为过时。与设备驱动程序通信的推荐替代机制是什么?
【问题讨论】:
【参考方案1】:POSIX 仅定义了ioctl()
功能的一个非常有限的子集——与 STREAMS 相关。由于 STREAMS 工具已过时,它的接口在 POSIX 中也已过时。
然而,ioctl()
自“永远”以来一直是 Unix 的一部分(它肯定是在第 7 版 UNIX 中,我可以肯定的是,即使在那时它也不是新的)。这是打开设备驱动程序后控制设备驱动程序的“方法”。唯一的问题是这些接口和控件没有标准化。
您可以查看<termios.h>
文件,了解为控制终端编写的一组函数。我希望典型的实现使用ioctl()
或其他类似的专用机制,但接口在标准化时是通用的(<termios.h>
接口与任何早期接口不同,无论是第 7 版或 System III 或任何其他接口)。如果您愿意,您可以在ioctl()
接口上编写用户将使用的标准函数;你可以实现这些函数来调用你的ioctl()
接口。
所以,ioctl()
不会消失;这是控制设备驱动程序的正确方法。 POSIX 的议程略有不同,仅此而已。
【讨论】:
为了扩展这一点,POSIX 逐步淘汰ioctl
并不表示不应使用ioctl
,而是POSIX 对指定硬件设备应如何工作不感兴趣。由于ioctl
也与 STREAMS 一起使用,POSIX 之前仅指定了ioctl
的那个方面(没有任何其他与设备一起使用),但现在 STREAMS 已过时,没有什么可指定的了。
谢谢 - 是的,这正是我的意思。
ioctl() 可以追溯到很久以前......我个人在 1980 年代使用过它。虽然我仍然在 1983 年的 System V 手册中描述了 ioctl(),但在 .h 文件和技术手册中发现了有关如何使用它的实际污垢。我会敦促您将有关您的 ioctl 的所有详细信息放在设备的 .h 文件中,以确保开发人员始终可以使用它。以上是关于替换 ioctl() 函数的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用replace函数替换dataframe中的值:replace函数对dataframe中指定数据列的值进行替换替换具体数据列的相关值