替换 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中指定数据列的值进行替换替换具体数据列的相关值

字符串替换函数

C++ 替换函数

nyoj 113 字符串替换 (string中替换函数replace()和查找函数find())

用占位符替换字符串并在函数之后将它们替换回来。