为什么close函数在Linux内核的`struct file_operations`中被称为release?

问题描述:

我试图做一个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

因为文件可能会多次打开,所以在关闭描述符时,只有在最后一次关闭调用文件的最后一次引用时才会调用release。所以关闭和释放是有区别的。

释放:称为在该文件的最后关闭(2),即,当 文件 - > f_count达到0。虽然定义为返回int,返回 值由VFS忽略(见FS/file_table。 C:__ fput())。 more

+2

让我们也注意到,mmap增加了对文件的引用,打开,mmap,关闭序列不会导致释放立即被调用,但当munmap被调用。 – auselen 2015-03-20 08:51:10

我也有类似的困惑。 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