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 调用的原型使用 unsigned long 作为第三个参数?