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