我正在尝试制作一个支持打开、关闭、读写操作的linux内核模块。所以我想通过struct file_operations注册这些函数,但是我在struct中找不到'close'条目。我想我应该使用'release'而不是'close',但我想知道为什么名字是'release'而不是'close'?
3 回答
因为文件可能会被多次打开,所以当你关闭一个描述符时,只有在最后一次关闭对文件的最后引用的调用时才会调用释放。所以关闭和释放是有区别的。
release:在该文件的最后一次 close(2) 时调用,即当 file->f_count 达到 0 时。虽然定义为返回 int,但返回值被 VFS 忽略(参见 fs/file_table.c:__fput())。更多的
我也有类似的困惑。Perreal 是正确的,因为在调用 close 时不会调用 release。这是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。如果您需要在关闭任何副本时刷新挂起的数据,您应该实现 flush 方法。
请注意,每次进程调用 close 时都不会调用 release。每当共享文件结构时(例如,在 fork 或 dup 之后),直到所有副本都关闭后才会调用 release。如果您需要在关闭任何副本时刷新挂起的数据,您应该实现 flush 方法。
取自 LDD3(第 3 章)。