2012-07-09 23 views
9

我試圖做一個Linux內核模塊,它支持打開,關閉,讀取和寫入操作。 所以我想通過結構file_operations註冊這些函數,但是我無法在結構中找到'close'條目。 我想我應該使用'release'而不是'close',但是我想知道爲什麼這個名字是'release'而不是'close'?爲什麼close函數在Linux內核的`struct file_operations`中被稱爲release?

+0

所以你問爲什麼它被稱爲'release'而不是'close'? – cnicutar 2012-07-09 10:58:00

+0

是的,我確定了標題。 – 2012-07-09 11:06:17

回答

11

因爲文件可能會多次打開,所以在關閉描述符時,只有在最後一次關閉調用文件的最後一次引用時纔會調用release。所以關閉和釋放是有區別的。

釋放:稱爲在該文件的最後關閉(2),即,當 文件 - > f_count達到0。雖然定義爲返回int,返回 值由VFS忽略(見FS/file_table。 C:__ fput())。 more

+2

讓我們也注意到,mmap增加了對文件的引用,打開,mmap,關閉序列不會導致釋放立即被調用,但當munmap被調用。 – auselen 2015-03-20 08:51:10

4

我也有類似的困惑。 Perreal是正確的,因爲在調用close時不會調用該版本。這裏是從書Linux Device Drivers 3rd edition的提取物:

int (*flush) (struct file *); 

當一個進程關閉其用於設備的文件描述符的拷貝的刷新操作被調用;它應該執行(並等待)設備上的任何未完成的操作。這不能與用戶程序請求的fsync操作混淆。目前,flush僅用於網絡文件系統(NFS)代碼。如果flush爲NULL,則不會調用它。

int (*release) (struct inode *, struct file *); 

當文件結構被釋放時調用此操作。像open一樣,release可能會丟失。

請注意,每次進程調用close時都不會調用release。無論何時共享文件結構(例如,在fork或dup之後),在所有副本都關閉之前,不會調用release。如果您需要在任何副本關閉時刷新待處理數據,則應執行刷新方法。

+1

如果一個進程有兩個文件描述符引用同一個文件,那麼對每個文件描述符調用'close()'會調用'release'兩次。 – Asblarf 2014-02-28 19:55:18

+1

@Asblarf這是有道理的,因爲在進程打開的每個文件描述符內核內部都會維護一個單獨的「struct file *」對象。 – 2014-03-01 21:04:34

+0

的確,這就是我通過仔細查看'struct file *'代表什麼的結果。 – Asblarf 2014-03-03 22:13:56

相關問題