ioctl 参数使用方法-实例+测试

这篇博客介绍了如何在C语言中使用ioctl函数进行设备控制,包括用户空间的调用示例和内核驱动的实现细节,如ioctl_open和ioctl_ioctl函数。通过示例代码展示了打开设备文件、发送命令和参数传递的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面的代码可以正常显示吗
obj-m = ioctl.o
KDIR  = /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)
default: 
	$(MAKE) -C $(KDIR) M=$(PWD) modules
clean: 
	$(RM) *.o *.mod.c *.ko *.order *.symvers -r
C语言的呢
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{
	int fd;
	int a = 8;
	fd = open("/dev/ioctl_misc",O_WRONLY);
	if(fd == -1)
			printf("open /dev/ioctl_misc failed\n");
	fd = ioctl(fd,0,&a);
	//fd = ioctl(fd,0,NULL);
	if(fd == -1)
			printf("ioctl faile\n");
	return 0;
}

c语言驱动程序试一试:
#include <linux/time.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
static int ioctl_open(struct inode *inode,struct file * filep)
{
	return 0;
}
static long ioctl_ioctl(struct file *filep,unsigned int cmd,unsigned long arg)
{
		void __user *tmp = (void __user *)arg;/*__user 是给内核代码静态分析工具Sparse用的,如果使用了__user
																					宏的指针不在用户地址空间初始化,或者指向内核地址空间,设备地址空间等
																					Sparse会给出警告的*/
		int __user *argp = tmp;
		int val;
		if(get_user(val,argp))						/*此处使用get_user(),不用copy_from_user(),原因在文章末尾总结处*/
				return -EFAULT;
		printk("ioctl val = %d\n",val);
		return 0;
}
static const struct file_operations ioctl_fops = {
	.owner = THIS_MODULE,
	.unlocked_ioctl = ioctl_ioctl,
	.open = ioctl_open,
};

static struct miscdevice ioctl_miscdev = {
	.minor = MISC_DYNAMIC_MINOR,
	.name = "ioctl_misc",
	.fops = &ioctl_fops,
};

static int __init ioctl_init(void)
{
	int err;
	err = misc_register(&ioctl_miscdev);
	if(err)
		return err;
	printk("ioctl register success\n");
	return 0;
}
static void __exit ioctl_exit(void)
{
	misc_deregister(&ioctl_miscdev);
}

module_init(ioctl_init);
module_exit(ioctl_exit);
MODULE_LICENSE("GPL");


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值