Linux 尝试访问结构文件私有\u数据时出错
问题是: 我有一个指向结构文件flip的指针,一个int名为cmd,一个unsigned long名为arg。 struct file points中的private_数据字段 专用_数据结构定义如下:Linux 尝试访问结构文件私有\u数据时出错,linux,module,linux-kernel,linux-device-driver,Linux,Module,Linux Kernel,Linux Device Driver,问题是: 我有一个指向结构文件flip的指针,一个int名为cmd,一个unsigned long名为arg。 struct file points中的private_数据字段 专用_数据结构定义如下: typedef struct { unsigned char key; int read_state; } my_private_data; int my_ioctl(struct inode *inode, struct file *filp, unsigned int cm
typedef struct {
unsigned char key;
int read_state;
} my_private_data;
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;
}
ioctl函数定义如下:
typedef struct {
unsigned char key;
int read_state;
} my_private_data;
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\u data
被定义为void*
,因此filp->private\u data
本身没有成员。如果要将数据项存储到结构中,可以使用该类型的本地文件访问它们;例如,在my\u ioctl()
中: