linux - 尝试访问结构文件 private_data 时出错
问题描述
问题:我有一个指向名为 Flip 的结构文件的指针,一个名为 cmd 的 int 和一个名为 arg 的 unsigned long。struct file中的private_data字段指向private_data结构体,定义如下:
typedef struct {
unsigned char key;
int read_state;
} my_private_data;
ioctl函数定义如下:
int my_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
switch (cmd) {
case CMD_CHANGE_KEY:
filp->private_data->key = (char)cmd;
filp->private_data->read_state = (int)arg;
break;
case CMD_SET_READ_STATE:
filp->private_data->key = (char)cmd;
filp->private_data->read_state = (int)arg;
break;
case CMD_ZERO:
kfree(buff_caesar);
break;
}
return 0;
}
但是,当我尝试编译代码时,我收到以下警告/错误:
Warning: dereferencing 'void *' pointer.
Requesting for Member 'key' in something not a struct or union.
Warning: dereferencing 'void *' pointer.
Requesting for Member 'read_state' in something not a struct or union.
我能做些什么来解决这个问题?
这是打开方法:
int my_open(struct inode *inode, struct file *filp)
{
int minor = MINOR(inode->i_rdev);
if(minor == ONE) {
/* Caesar*/
filp->f_op = &fops_caesar;
}
else if(minor == TWO){
/*Xor*/
filp->f_op = &fops_xor;
}
else return -ENODEV;
my_private_data* privateData = NULL;
privateData = kmalloc(sizeof(my_private_date),GFP_KERNEL);
if (privateData==NULL){
return -1;
}
filp->private_data = privateData;
return 0;
}
解决方案
struct file
成员.private_data
被定义为 a void *
,因此它filp->private_data
本身没有成员。如果要将数据项存储到结构中,可以使用该类型的本地访问它们;例如,在my_ioctl()
:
my_private_data *info;
. . .
if (filp->private_data == NULL) {
error handling
}
info = filp->private_data;
. . .
info->key = (char) cmd;
info->read_state = (int) arg;
推荐阅读
- r - 有没有更优雅的方式在 R Shiny 中动态创建变量?
- java - 登录 Unix 位置
- angular - Angular http post请求失败
- java - 读取和写入txt文件
- excel - Soundcloud 歌曲名称
- python - GCP 中的 PySpark 内核 - Unicode 字符串
- file-io - 从 emscripten 读取大型用户提供的文件,一次读取一个块
- linux - 在 ambari 集群中使用不同操作系统版本时如何禁用脚本 os_check_type.py
- c# - 在 Xamarin 表单中选择多个多边形(Android 和 iOS)
- javascript - 电子表格无法运行脚本