【问题标题】:Why is the close function is called release in `struct file_operations` in the Linux kernel?为什么Linux内核的`struct file_operations`中的close函数被称为release?
【发布时间】:2020-02-17 14:13:03
【问题描述】:

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

【问题讨论】:

  • 所以你问为什么叫release而不是close

标签: linux linux-kernel kernel


【解决方案1】:

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

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

【讨论】:

  • 我们还要注意 mmap 增加了对文件的引用; open、mmap、close 序列不会导致立即调用 release 而是调用 munmap 时。
【解决方案2】:

我也有类似的困惑。 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两次。
  • @Asblarf 这是有道理的,因为内核内部将为进程打开的每个文件描述符维护一个单独的“struct file*”对象。
  • 没错,这就是我通过仔细查看struct file * 所代表的内容而发现的。
【解决方案3】:

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

取自 LDD3(第 3 章)。

【讨论】:

    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2015-12-03
    • 2019-11-06
    相关资源
    最近更新 更多