字符设备之open()与release()函数

本文详细介绍了Linux设备驱动程序中的open()和release()函数。open()通常用于设备操作的开始,负责初始化设备和设置操作集合;release()则在设备不再使用时释放资源。文章还探讨了这两个函数的具体实现细节及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    open()往往是一个设备操作的发起者,而release()往往是一个设备操作的终结者.


    1.open():

    当我们要操作一个设备时,往往第一个动作就是open().其原型如下:

int (*open)(struct inode *inode,struct file *filp);
    其中,两个参数inode和filp由内核根据我们打开的设备节点信息(如主次设备号,字符设备等)来填充,这样我们可以通过这两个参数来找到我们要操作的目标设备.这对于一个驱动对应多个设备的情况非常实用.一般来说,根据函数open()的作用编程规则如下:
1).检查设备特定的错误(如设备未就绪);
2).对设备实现初始化;
3).更新f_op指针.这一点很实用,比如带有子系统的驱动模型,一般有系统默认的操作集,如果系统默认的操作集满足不了我们的需求时,我们可以通过更新f_op指针指向我们具体的操作集,实现了操作集的重载.其中LCD子系统就是这么干的;
4).有必要时更新filp->private_data.当多个设备共享一套驱动时,为后续读写数据交互,可以借助这个"桥梁".
    其中,LDD3中P63是一个比较经典的用法:

int scull_open(struct inode *inode,struct file *filp)
{
    struct scull_dev *dev;
    dev = container_of(inode->i_cdev,struct scull_dev,cdev);
    filp->private_data = dev;
    do something;
    return 0;
}

    2.release():

    release()完成与open()相反的工作.释放open()向内核申请的所有资源.实际使用过程中主要注意两点:

    2-1.close()并不完全是release():

    内核对每个file结构维护其被使用的计数,无论是fork还是dup,都不会创建新的数据结构,如fork和dup,它们只是增加已有(由open生成)结构中的计数.只有在file结构的计数为0时,close才会实质地调用release.因此,并不是每个close系统调用都会引起对release方法的调用;

    2-2.内核自动关闭:

    内核在进程退出时,会在内部使用close系统调用自动关闭所有相关文件.

   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值