嵌入式Linux驱动:不能多次close(fd)
文章目录一、问题二、解决一、问题驱动程序// buffer数组的最大长度#define RWBUF_MAX_SIZE 1024// 设备中存储信息的全局结构体指针typedef struct Data{// 用于打开和释放的验证,0表示未使用,1表示已使用int count;// 表示字符串char buffer[RWBUF_MAX_SI...
·
一、问题
- 驱动程序
// 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;
}
}
- 用户测试程序
// 设备关闭
close(fd);
printf("[close-success]\n");
close(fd);
printf("[close-release-success]\n");
- 可以看到没出现对应
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;
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)