14

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

4

3 回答 3

18

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

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

于 2012-07-09T11:05:35.123 回答
6

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

于 2014-02-12T20:24:05.137 回答
0

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

取自 LDD3(第 3 章)。

于 2020-02-17T06:13:03.217 回答