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

Tak*_*ato 10 linux kernel linux-kernel

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

per*_*eal 12

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

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

  • 我们还要注意,mmap会增加对文件的引用; open,mmap,close序列不会导致立即调用release,但是当调用munmap时. (2认同)

Saf*_*med 6

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

int (*flush) (struct file *);
Run Code Online (Sandbox Code Playgroud)

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

int (*release) (struct inode *, struct file *);
Run Code Online (Sandbox Code Playgroud)

当文件结构被释放时调用此操作。与 open 一样,release 可能会丢失。

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