open方法
open方法提供給驅動程序以初始化的能力,在大部分驅動程序匯總,open應該完成以下工作:
1. 檢查特定設備的錯誤,如設備為准備就緒或者硬件問題;
2. 如果設備是首次打開,則對其進行初始化;
3. 如有必要,更新f_op指針;
4. 分配並填寫置於filp->private_data里面的數據結構;
open方法的原型如下:
1 int (*open) (struct inode *, struct file *);
其中inode參數在其i_cdev字段中包含了我們所需要的信息,即我們先前設置的cdev結構;
release方法
release方法的作用正好與open相反,這個方法完成以下工作:
1. 釋放由open分配的、保存的filp->private_data中的所有內容;
2. 在最后一次關閉操作時關閉設備;
release方法的原型如下:
1 int (*release) (struct inode *, struct file *);
close系統調動與release方法
並不是每個close系統調用都會引起對release方法的調用,只有那些真正釋放設備數據結構的close調用才會調用這個方法。內核對每個file結構維護一個引用計數器;無論是fork還是dup,都不會創建數據結構(僅由open創建),它們只是增加了已有數據結構中的計數;只有在file結構的計數器為0時,close系統調用才會執行release方法,這只是刪除結構是才發生;release和close的關系保證了對於每次open驅動程序,只有一次release調用;
flush在應用程序每次調用close時都會被調用;
內核在進程退出的時候,通過在內部使用close系統調用自動關閉所有相關文件;