我正在尝试制作一个linux内核模块,它支持打开、关闭、读和写操作。所以我想通过struct file_operations注册这些函数,但是在struct中找不到“关闭”条目。我认为我应该使用'release‘而不是'close',但是我想知道为什么这个名字是'release’而不是'close'?
发布于 2012-07-09 11:05:35
因为文件可能被多次打开,所以当您关闭描述符时,只有在上次对文件的最后引用的关闭调用时才调用释放。所以,封闭和释放是有区别的。
释放:在该文件的最后一个关闭(2)处调用,即当file->f_count达到0时调用。尽管定义为返回int,但VFS忽略了返回值(请参见fs/file_table.c:__fput())。更多
发布于 2014-02-12 20:24:05
我也有过类似的困惑。Perreal是正确的,因为当close被调用时,版本不会被调用。以下是Linux设备驱动程序第三版一书的摘录
int (*flush) (struct file *);当进程关闭设备的文件描述符副本时,会调用刷新操作;它应该在设备上执行(并等待)任何未完成的操作。这不能与用户程序请求的fsync操作混淆。目前,刷新只在网络文件系统(NFS)代码中使用。如果刷新为NULL,则根本不调用它。
int (*release) (struct inode *, struct file *);在释放文件结构时调用此操作。就像打开一样,释放可能会丢失。
注意,发布并不是每次进程调用关闭时调用的。每当文件结构被共享时(例如,在叉或dup之后),在关闭所有副本之前,都不会调用发布。如果在关闭任何副本时需要刷新挂起的数据,则应该实现刷新方法。
发布于 2020-02-17 06:13:03
注意,发布并不是每次进程调用关闭时调用的。每当文件结构被共享时(例如,在叉或dup之后),在关闭所有副本之前,都不会调用发布。如果在关闭任何副本时需要刷新挂起的数据,则应该实现刷新方法。
摘自LDD3 (第三章)。
https://stackoverflow.com/questions/11393674
复制相似问题