通用文件系统访问接口

文件和目录相关用户库函数

Lab8 中部分用户库函数与文件系统有关,我们先讨论对单个文件进行操作的系统调用,然后讨论对目录和文件系统进行操作的系统调用。

在文件操作方面,最基本的相关函数是 open、close、read、write。在读写一个文件之前,首先要用 open 系统调用将其打开。open 的第一个参数指定文件的路径名,可使用绝对路径名;第二个参数指定打开的方式,可设置为 O_RDONLY、O_WRONLY、O_RDWR,分别表示只读、只写、可读可写。在打开一个文件后,就可以使用它返回的文件描述符 fd 对文件进行相关操作。在使用完一个文件后,还要用 close 系统调用把它关闭,其参数就是文件描述符 fd。这样它的文件描述符就可以空出来,给别的文件使用。

读写文件内容的系统调用是 read 和 write。read 系统调用有三个参数:一个指定所操作的文件描述符,一个指定读取数据的存放地址,最后一个指定读多少个字节。在 C 程序中调用该系统调用的方法如下:

count = read(filehandle, buffer, nbytes);

该系统调用会把实际读到的字节数返回给 count 变量。在正常情形下这个值与 nbytes 相等,但有时可能会小一些。例如,在读文件时碰上了文件结束符,从而提前结束此次读操作。

如果由于参数无效或磁盘访问错误等原因,使得此次系统调用无法完成,则 count 被置为-1。而 write 函数的参数与之完全相同。

对于目录而言,最常用的操作是跳转到某个目录,这里对应的用户库函数是 chdir。然后就需要读目录的内容了,即列出目录中的文件或目录名,这在处理上与读文件类似,即需要通过 opendir 函数打开目录,通过 readdir 来获取目录中的文件信息,读完后还需通过 closedir 函数来关闭目录。由于在 ucore 中把目录看成是一个特殊的文件,所以 opendir 和 closedir 实际上就是调用与文件相关的 open 和 close 函数。只有 readdir 需要调用获取目录内容的特殊系统调用 sys_getdirentry。而且这里没有写目录这一操作。在目录中增加内容其实就是在此目录中创建文件,需要用到创建文件的函数。

文件和目录访问相关系统调用

与文件相关的 open、close、read、write 用户库函数对应的是 sys_open、sys_close、sys_read、sys_write 四个系统调用接口。与目录相关的 readdir 用户库函数对应的是 sys_getdirentry 系统调用。这些系统调用函数接口将通过 syscall 函数来获得 ucore 的内核服务。当到了 ucore 内核后,在调用文件系统抽象层的 file 接口和 dir 接口。

results matching ""

    No results matching ""