在这之前虽然已经完成了文件系统的物理设计,但是我们还没有定义相应的操作,还无法在硬盘上创建文件,删除文件等操作,这里先看看在Linux下使用文件系统的相关系统调用如何操作。功能是先创建一个文件,写入abcde这5个字符,再读入其中的前3个字符打印出来。
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <string.h>
- #include <assert.h>
- int main()
- {
- int fd;
- int n;
- const char filename[] = "test";
- const char bufw[] = "abcde";
- const int rd_bytes = 3;
- char bufr[rd_bytes];
- assert(rd_bytes <= strlen(bufw));
- fd = open(filename,O_CREAT | O_RDWR | O_TRUNC,0644);
- if(fd == -1)
- {
- printf("failed to open %s/n",filename);
- return 1;
- }
- n = write(fd,bufw,strlen(bufw));
- if(n != strlen(bufw))
- {
- printf("failed to write to %s/n",filename);
- close(fd);
- return 2;
- }
- close(fd);
- fd = open(filename,O_RDWR);
- if(fd == -1)
- {
- printf("failed to open %s/n",filename);
- return 3;
- }
- n = read(fd,bufr,rd_bytes);
- if(n != rd_bytes)
- {
- printf("failed to read %s/n",filename);
- close(fd);
- return 4;
- }
- bufr[n] = '/0';
- printf("%d bytes read: %s/n",n,bufr);
- close(fd);
- return 0;
- }
我们要借鉴Linux的文件描述符这个概念,就是open函数返回的值,这个值是进一步操作文件的所需要的值,我们看到在write函数和read函数中的第一个形参都要求传入一个要操作的文件的文件描述符。
这个值其实是个索引,每个进程的PCB中都有一个文件描述符的指针数组,open函数返回的索引就确定了使用哪个文件描述符,这个数组的大小规定了一个进程能够同时打开多少个文件。内核维护一个文件描述符的结构数组,它的大小确定了所有的进程可以同时打开的不同文件的个数,因为多个进程可以同时打开一个文件,这里理应加入互斥功能,但为了简单起见就不管它。一个文件描述符有3个字段。等会看代码就知道了。
先修改PCB,加入文件描述符的指针数组:
include/proc.h
- #define MAX_FILE_PER_PROC 10 /* 每个进程最多可以打开的不同的文件个数 */
- ...
- /* 在PCB的定义中追加 */
- /* 指向全局文件描述符的指针数组 */
- File_Descriptor *fd_ptr_table[MAX_FILE_PER_PROC];
然后把每个进程的这个数组都初始化为0,就是空指针,在Init_PCB函数中添加:
kernel/proc.c
- /* FD的指针数组初始化为0 */
- int j;
- for(j = 0;j < MAX_FILE_PER_PROC;j++)
- {
- p_Cur_PCB->fd_ptr_table[j] = 0;
- }
在添加File_Descriptor的定义:
include/fs.h
- #define MAX_FILE 20 /* 全部进程同时可打开的不相同的文件 */
- /* 文件描述符结构定义 */
- typedef struct s_fd
- {
- int fd_access_mode; /* 文件的访问模式,可读还是可写等 */
- int fd_pos; /* 读写一个文件的位置指针 */
- I_Node *fd_inode; /* 当前文件的i结点指针 */
- }File_Descriptor;
再定义一个全局文件描述符数组,分别在include/global.h和kernel/global.c中添加:
- extern File_Descriptor FD_Table[MAX_FILE]; /* 文件描述符数组 */
- File_Descriptor FD_Table[MAX_FILE]; /* 文件描述符数组 */
头文件的包含和makefile的修改不赘述。
文件描述符数组的初始化日后再说。今天先这样。。