首页 > 解决方案 > 尝试访问结构文件 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;
}

标签: linuxmodulelinux-kernellinux-device-driver

解决方案


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;

推荐阅读