为啥 ioctl 调用的原型使用 unsigned long 作为第三个参数?

Posted

技术标签:

【中文标题】为啥 ioctl 调用的原型使用 unsigned long 作为第三个参数?【英文标题】:Why prototype of ioctl call is using unsigned long as third argument?为什么 ioctl 调用的原型使用 unsigned long 作为第三个参数? 【发布时间】:2013-11-11 11:39:12 【问题描述】:

下面是一个ioctl调用的原型

long ioctl(struct file *f, unsigned int cmd, unsigned long arg);

为什么 ioctl 的第三个参数默认为 unsigned long?有时我们会传递一个指向它的指针。但它使用的是 unsigned long。

【问题讨论】:

这个页面:man7.org/linux/man-pages/man2/ioctl.2.html 给出了一个不同的原型,并说第三个参数曾经是一个指针。你的原型究竟是从哪里得到的? official POSIX reference 用省略号表示。另一方面,POSIX 声明此调用仅适用于 STREAMS 设备。 【参考方案1】:

在内核中,unsigned long 经常被用作指针的替代,因为指针在每个架构上总是有这个大小。 Ioctls 也可以将整数作为参数,所以这在这里很有意义。这必须为每个 ioctl 定义。

请注意,ioctl 已被弃用,unlocked_ioctls 必须在当前内核版本中使用:http://lwn.net/Articles/119652/

【讨论】:

以上是关于为啥 ioctl 调用的原型使用 unsigned long 作为第三个参数?的主要内容,如果未能解决你的问题,请参考以下文章

compat_ioctl 对于 unsigned long long 数据类型不能正常工作

Linux设备驱动程序 之 ioctl

:高级字符驱动程序操作

为啥 ioctl 返回“错误地址”

为啥有些 ioctl 案例总是失败?

为啥 IOCTL 命令号在整个系统中应该是唯一的?