本文深入源码讲述了Coffee文件系统关闭文件cfs_close函数。

当文件不使用时,需要关闭,这样可以释放文件占有的内部资源(如fd),腾出缓存可他用(possibly commit any cached data to permanent storage)[1],源代码如下:

void cfs_close(int fd)
{
  if (FD_VALID(fd))
  {
    coffee_fd_set[fd].flags = COFFEE_FD_FREE;
    coffee_fd_set[fd].file->references--;
    coffee_fd_set[fd].file = NULL;
  }
}

#define FD_VALID(fd) ((fd)>= 0 && (fd)<COFFEE_FD_SET_SIZE && coffee_fd_set[(fd)].flags!=COFFEE_FD_FREE)

首先进行fd参数验证,确保fd有效。如果fd不在[0, COFFEE_FD_SET_SIZE)范围内,说明传递的fd参数无效,如果该fd对应的file_descflagsCOFFEE_FD_FREE,则说明该fd本来就是空闲的,无需再释放。如果fd有效,则将其对应的file_descflags设为COFFEE_FD_FREE,以便下次cfs_open函数可以找到可用的fd,而后将与该file_desc关联文件file的引用次数减1,最后将file_desc指向的file设为空。

用宏FILE_UNREFERENCED可以判断文件引用次数是否为0,这个宏在load_file函数被调用,FILE_UNREFERENCED宏定义如下:

#define FILE_UNREFERENCED(file) ((file)->references == 0)

另,我觉得这个函数设计不够合理。cfs_close应该要有返回值(fd失效返回-1,执行成功返回0),增强程序的健壮性。

参考资料:

[1]

本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-03-22 00:03

results matching ""

    No results matching ""