首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么关闭函数在‘file_operations`内核中被称为file_operations`版本?

为什么关闭函数在‘file_operations`内核中被称为file_operations`版本?
EN

Stack Overflow用户
提问于 2012-07-09 10:56:18
回答 3查看 10.3K关注 0票数 15

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-09 11:05:35

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

释放:在该文件的最后一个关闭(2)处调用,即当file->f_count达到0时调用。尽管定义为返回int,但VFS忽略了返回值(请参见fs/file_table.c:__fput())。更多

票数 20
EN

Stack Overflow用户

发布于 2014-02-12 20:24:05

我也有过类似的困惑。Perreal是正确的,因为当close被调用时,版本不会被调用。以下是Linux设备驱动程序第三版一书的摘录

代码语言:javascript
复制
int (*flush) (struct file *);

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

代码语言:javascript
复制
int (*release) (struct inode *, struct file *);

在释放文件结构时调用此操作。就像打开一样,释放可能会丢失。

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

票数 6
EN

Stack Overflow用户

发布于 2020-02-17 06:13:03

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

摘自LDD3 (第三章)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11393674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档