为什么在Linux内核的`struct file_operations`中调用close函数?

时间:2012-07-09 10:56:18

标签: linux linux-kernel kernel

我正在尝试制作一个Linux内核模块,它支持打开,关闭,读取和写入操作。 所以我想通过struct file_operations注册这些函数,但是我在struct中找不到'close'条目。 我想我应该使用'release'而不是'close',但我想知道为什么这个名字是'release'而不是'close'?

3 个答案:

答案 0 :(得分:12)

由于文件可能会多次打开,因此当您关闭描述符时,仅在最后一次关闭调用时才会调用该文件的最后一次调用。所以关闭和发布之间存在差异。

  

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

答案 1 :(得分:4)

我有类似的困惑。 Perreal是正确的,因为调用close时不会调用该版本。以下是本书Linux Device Drivers 3rd edition的摘录:

int (*flush) (struct file *);

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

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

在释放文件结构时调用此操作。像开放一样,发布可能会丢失。

请注意,每次进程调用close时都不会调用release。每当共享文件结构时(例如,在fork或dup之后),在关闭所有副本之前不会调用release。如果在关闭任何副本时需要刷新挂起数据,则应实现flush方法。

答案 2 :(得分:0)

请注意,每次流程关闭时不会调用release。 每当共享文件结构时(例如,在fork或 dup),直到所有副本均关闭后,版本才会被调用。如果你需要 在关闭任何副本时刷新挂起的数据,您应该实现 冲洗方法。

摘自LDD3(第3章)。