为啥 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 作为第三个参数?的主要内容,如果未能解决你的问题,请参考以下文章