ioctl怎么使用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ioctl怎么使用?相关的知识,希望对你有一定的参考价值。

我想用ioctl来控制鼠标,但是不知道第二个参数cmd该怎么写。能不能给个例子啊,或者告诉我怎么弄清楚第二个参数cmd。

BOOL IOCtl( longlCommand, DWORD* lpArgument );

DWORD dwParam = 0 ;
DWORD* pAug = &dwParam .

1. cmd = FIOBIO
*pAug = 1 ; // 非0值表示设置ioctl为非阻塞
*pAug = 0 ; // 0表示设置ioctl为阻塞.
pAug用于设置.

2. cmd = FIONREAD
*pAug = operational result
// pAug存储的是读取的结束
// 如果socket = sock_stream, *pAug = bytes read(读取的字节数)
// 如果socket = sock_datagram, *pAug = 第一个数据包(datagram)的大小
pAug用于接收

3. cmd = SIOCATMARK
*pAug = read result
// 如果没有重要的数据等待读取,操作返回非0值
// 否则返回0
pAug用于接收
参考技术A static int motor_driver_ioctl(struct inode *inode, struct file *file, unsigned int cmd,unsigned long arg)

get_user(val,(int __user*)arg); //内核空间不能直接取用户空间的指针的

switch (cmd) 追问

这是哪个文件里面的,在哪个目录下?

追答

自己写的,驱动里面的,建议你上网学一下用法。

IOCTL:仅在 switch-case 中使用参数 0

【中文标题】IOCTL:仅在 switch-case 中使用参数 0【英文标题】:IOCTL: only work with parameter 0 in the switch-case 【发布时间】:2016-04-15 11:32:57 【问题描述】:

我正在为嵌入式系统创建驱动程序。我正在使用 IOCTL 功能。 设备已正确注册,打开和写入功能按预期工作,但 IOCTL 没有。

当我使用参数 0 从用户空间调用 IOCTL 时,使用 ioctl_num = 0 调用 my_ioctl 函数,但是当我使用任何其他值时,不会调用 my_ioctl 内核函数。

 #define READ_IOCTL                      _IO(UAM_DEV_MAGIC, 0)
 #define WRITE_IOCTL                     _IO(UAM_DEV_MAGIC, 1)
 #define ASK_VALUE                       _IO(UAM_DEV_MAGIC, 2)

当我使用 READ_IOCTL (0) 从用户空间进行 IOCTL 调用时,一切正常。但是,当我尝试 WRITE_IOCTL 和 ASK_VALUE(1 和 2)时。

如果我使用以下内容:

#define READ_IOCTL                      _IO(UAM_DEV_MAGIC, 1)
#define WRITE_IOCTL                     _IO(UAM_DEV_MAGIC, 0)
#define ASK_VALUE                       _IO(UAM_DEV_MAGIC, 2)

仅适用于来自用户空间的 WRITE_IOCTL 调用。我正在使用 linux 3.16 和 PowerPC。知道有什么问题吗?

【问题讨论】:

这里是一个示例驱动程序。可能会有所帮助github.com/jeyaramvrp/kernel-module-programming/tree/master/… 感谢您的回答。我已经看过代码,但它似乎与我所做的非常相似。看起来程序没有重新调整幻数。知道为什么它适用于 0 而不是 1、2、3 等吗? Any idea why does it work with 0 and not with the 1,2,3,etc? - 您的代码可能与预定义的 ioctl 代码一致。见man ioctl_list。 【参考方案1】:

我找到了解决方案。我在 64 位内核中。用户空间中的 c 代码是 32 位的。我必须编译成 64 位才能工作。

【讨论】:

以上是关于ioctl怎么使用?的主要内容,如果未能解决你的问题,请参考以下文章

IOCTL:仅在 switch-case 中使用参数 0

终端窗口大小不使用 ioctl 更新

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

麻烦问一下Linux下GPIO驱动的问题,ioctl函数和write函数有啥区别,

在 AIX 上使用 ioctl 的网络接口的硬件地址

使用 Python 向网络驱动程序发送 IOCTL 调用