Linux基礎知識 open close

2021-09-07 07:09:37 字數 2212 閱讀 6159

下面說一下在使用者空間呼叫open/close/dup跟驅動中的open和release的對應。

下面是測試驅動:

1 #include 2 #include 3 #include 456

static

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 678

int 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...