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

我试图做一个Linux内核模块,它支持打开,closures,读取和写入操作。 所以我想通过结构file_operations注册这些函数,但是我无法find结构中的“closures”条目。 我想我应该使用“释放”而不是“closures”,但是我想知道为什么这个名字是“释放”而不是“closures”?

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

release:在文件的最后一个close(2)处调用,即当file-> f_count达到0时。虽然定义为返回int,但VFS忽略返回值(请参阅fs / file_table.c:__ fput())。 更多

我也有类似的困惑。 Perreal是正确的,因为在调用close时不会调用release。 以下是本书“ Linux设备驱动程序”第3版的摘录:

 int (*flush) (struct file *); 

刷新操作在进程关闭其设备的文件描述符副本时被调用; 它应该执行(并等待)设备上的任何未完成的操作。 这不能与用户程序请求的fsync操作混淆。 目前,flush仅用于网络文件系统(NFS)代码。 如果flush是NULL,则不会调用它。

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

当文件结构被释放时,这个操作被调用。 像打开,发布可能会丢失。

请注意,每次进程调用close时都不会调用release。 无论何时共享文件结构(例如,在fork或dup之后),在所有副本关闭之前,release都不会被调用。 如果您需要在任何副本关闭时刷新待处理数据,则应该执行刷新方法。