下面說一下在使用者空間呼叫open/close/dup跟驅動中的open和release的對應。
下面是測試驅動:
1 #include 2 #include 3 #include 456static
int misc_demo_open(struct inode *nodp, struct file *filp)712
13static
int misc_demo_release(struct inode *nodp, struct file *filp)
1419
20static
struct file_operations misc_demo_fops =;
2526
static
struct miscdevice misc_demo_dev =;
3132
static __init int misc_demo_init(void)33
4041
static __exit void misc_demo_exit(void)42
4748
module_init(misc_demo_init);
49module_exit(misc_demo_exit);
50 module_license("
gpl");
下面是使用者空間測試程式碼:
1 #include 2 #include 3 #include 4 #include 5 #include 678int main(int argc, const
char *argv)920
21 sleep(5
);22
23 printf("
begin close.\n");
24for (i=0; i<3; i++)
2930 sleep(2
);31
32 printf("
begin close dup.\n");
33for (i=0; i<3; i++)
3839
return0;
40 }
下面是輸出的log:
begin open.[ 4628.805135
] misc_demo_open enter, nodp: c3b88a18, filp: c3859060.
open:
3dup: 4[
4629.809860
] misc_demo_open enter, nodp: c3b88a18, filp: c3859c40.
open:
5dup: 6[
4630.814891
] misc_demo_open enter, nodp: c3b88a18, filp: c3859ec0.
open:
7dup:
8begin close.
close:
3close:
5close:
7begin close dup.
close dup: 4[
4641.845172
] misc_demo_release enter, nodp: c3b88a18, filp: c3859060.
close dup: 6[
4642.850183
] misc_demo_release enter, nodp: c3b88a18, filp: c3859c40.
close dup: 8[
4643.855123] misc_demo_release enter, nodp: c3b88a18, filp: c3859ec0.
通過分析log,我們得出結論, 使用者空間每呼叫一次open,驅動中的open都會被執行一次,而在呼叫dup的時候,只是將struct file的引用計數加1,而沒有產生新的struct file,所以返回的新的fd跟老的fd對應的是同乙個struct file,同時也沒用呼叫open。在close的時候,只有struct file對應的所有fd都被關閉或者說struct file的引用計數為0的時候,驅動中的release才會被執行。
此外,如果將同時執行多個test程式,會發現,inode的位址都相同,說明每個檔案只有乙個inode與之對應。
完。
linux基礎知識
舉例來說,硬碟的檔名稱即為 dev hd a d 其中,括號內的字母為 a d 當中的任何乙個,亦即由 dev hda,dev hdb,dev hdc,及 dev hdd 這四個檔案的意思 注 這種型式的表示法在後面的章節當中會使用得很頻繁,請特別留意 那麼光碟機與軟盤呢?分別是 dev cdrom...
Linux基礎知識
檔案系統 分割槽和掛載 linux 檔案系統是乙個檔案樹,它的所有檔案和外部裝置都是以檔案的形式掛結在這個檔案樹上,例如 usr local 目錄結構屬於分割槽 linux 下,分割槽屬於目錄結構。預設檔案系統一般為ext3 ext2的公升級版 分割槽包括主分割槽 擴充套件分割槽 邏輯分割槽和swa...
linux基礎知識
軟體環境 centos release 6.5 final 1 如何使vm虛擬機器上的centos連線到外網?1 把vm虛擬機器上的network connection設定為bridge模式 2 把網絡卡eth0配置資訊中的bootproto設定為dhcp 3 win7的cmd中輸入ipconfig...