一、问题

  1. 驱动程序
// buffer数组的最大长度
#define RWBUF_MAX_SIZE 1024
// 设备中存储信息的全局结构体指针
typedef struct Data
{
    // 用于打开和释放的验证,0表示未使用,1表示已使用
    int count;
    // 表示字符串
    char buffer[RWBUF_MAX_SIZE];
} Data, *DataPtr;

DataPtr myDataPtr = NULL;

// 设备的关闭:返回-1表示错误;返回0表示成功
int rwbuf_release(struct inode *inode, struct file *file)
{
    // 当未打开时,报错
    if (myDataPtr == NULL)
    {
        printk("[rwbuf_release-error]\n");
        return -1;
    }
    // 当没用用户使用时,释放
    if (myDataPtr->count == 0)
    {
        kfree(myDataPtr);
        printk("[rwbuf_release-free-success]myDataPtr->count = %d.\n", myDataPtr->count);
        return 0;
    }
    // 当有用户使用时,则自减
    else
    {
        myDataPtr->count -= 1;
        printk("[rwbuf_release-countdown]myDataPtr->count = %d.\n", myDataPtr->count);
        return 0;
    }
}

在这里插入图片描述

  1. 用户测试程序
// 设备关闭
close(fd);
printf("[close-success]\n");

close(fd);
printf("[close-release-success]\n");

在这里插入图片描述

  1. 可以看到没出现对应printk("[rwbuf_release-free-success]myDataPtr->count = %d.\n", myDataPtr->count);的结果,即没有释放成功。
    在这里插入图片描述

二、解决

既然close(fd)只能生效一次,那么移动到里面就行了。

// 设备的关闭:返回-1表示错误;返回0表示成功
int rwbuf_release(struct inode *inode, struct file *file)
{
    // 当未打开时,报错
    if (myDataPtr == NULL)
    {
        printk("[rwbuf_release-error]\n");
        return -1;
    }
    // 当有用户使用时,则自减
    else
    {
        myDataPtr->count -= 1;
        printk("[rwbuf_release-countdown]myDataPtr->count = %d.\n", myDataPtr->count);

        // 当没用用户使用时,释放
        if (myDataPtr->count == 0)
        {
            kfree(myDataPtr);
            printk("[rwbuf_release-free-success]\n");
            return 0;
        }
        return 0;
    }
}

在这里插入图片描述

Logo

更多推荐