linux字符设备学习笔记(六)ioctl

怎样使用ioctl

1.用户系统调用

int ioctl(int fd,int cmd,...)

省略号后面代表有些操作还需要命令
比如设置波特率

ioctl(fd,SET_BAUD_RATE,115200);

2.cmd命令码格式
推荐把cmd分成4个字段;
用户空间与linux内核中定义需一致;
在这里插入图片描述
设备类型:‘k’ ;//这个’k‘是一个魔数或者称幻数,是一个特殊的标识,检查它,可以防止错误的传达指令,'k’可以任意指定,但是最好不要和别人重名。

#define HELLO_MAGIC  'k'
#define CHAR_ONE _IO(CHAR_MAGIC,1);
#define CHAR_ONE _IO(CHAR_MAGIC,2);

_IO()

在这里插入图片描述
在这里插入图片描述

序列号:表示操作命令的序号
方向:这条命令表示是否要在用户空间和内核空间之间交换数据,交换数据的方向。
比如:
00:不交换
01:内核---->用户
10:用户---->内核
11:双向交换
数据尺寸:表示交换多大的数据

_IOR()

比如_IOR(‘K’,20,int);
R;指的是数据方向,从内核空间到用户空间
int:表示sizeof(int)=4;
在这里插入图片描述

_IOW()

_IOW(‘k’,10,long)

在这里插入图片描述

_IOWE()

_IOWR(‘k’,5,double)
在这里插入图片描述

capable(CAP_SYS_ADMIN)

检查应用程序是否有root权限,有很多设备,root才能进行某些操作。

面试题:

已知一个结构体变量中某个成员的地址,求出这个结构体变量本身的地址。注意结构体的内容是可能变化的,需要一个公式来求。

#include <stdio.h>
struct AA
{
	int x;
	short y;
	int d;
	double f;
}
int main()
{
	struct AA a;
	printf("%p\n",&a);//这个是要求的结果
	return 0}

假设我们已知成员d的地址,求a的地址。
解:
关键是要求出偏移量

在这里插入图片描述

#include <stdio.h>
struct AA
{
	int x;
	short y;
	int d;
	double f;
}
int main()
{
    struct AA a;
	//怎么求偏移量
	printf("%p\n",&(((struct AA)*0)->d));
	printf("%p\n",(char*)&a.d-(unsigned long)&(((struct AA)*0)->d));
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<( ̄︶ ̄)Okay.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值