创建文件之文件描述符


  99人阅读  评论(3)  收藏  举报

    在这之前虽然已经完成了文件系统的物理设计,但是我们还没有定义相应的操作,还无法在硬盘上创建文件,删除文件等操作,这里先看看在Linux下使用文件系统的相关系统调用如何操作。功能是先创建一个文件,写入abcde这5个字符,再读入其中的前3个字符打印出来。

Code:
  1. #include <stdio.h>  
  2. #include <sys/types.h>  
  3. #include <sys/stat.h>  
  4. #include <fcntl.h>  
  5. #include <string.h>  
  6. #include <assert.h>  
  7.   
  8. int main()  
  9. {  
  10.     int fd;  
  11.     int n;  
  12.     const char filename[] = "test";  
  13.     const char bufw[] = "abcde";  
  14.     const int rd_bytes = 3;  
  15.     char bufr[rd_bytes];  
  16.       
  17.     assert(rd_bytes <= strlen(bufw));  
  18.       
  19.     fd = open(filename,O_CREAT | O_RDWR | O_TRUNC,0644);  
  20.     if(fd == -1)  
  21.     {  
  22.         printf("failed to open %s/n",filename);  
  23.         return 1;  
  24.     }  
  25.       
  26.     n = write(fd,bufw,strlen(bufw));  
  27.     if(n != strlen(bufw))  
  28.     {  
  29.         printf("failed to write to %s/n",filename);  
  30.         close(fd);  
  31.         return 2;  
  32.     }  
  33.       
  34.     close(fd);  
  35.       
  36.     fd = open(filename,O_RDWR);  
  37.     if(fd == -1)  
  38.     {  
  39.         printf("failed to open %s/n",filename);  
  40.         return 3;  
  41.     }  
  42.       
  43.     n = read(fd,bufr,rd_bytes);  
  44.     if(n != rd_bytes)  
  45.     {  
  46.         printf("failed to read %s/n",filename);  
  47.         close(fd);  
  48.         return 4;  
  49.     }  
  50.       
  51.     bufr[n] = '/0';  
  52.     printf("%d bytes read: %s/n",n,bufr);  
  53.       
  54.     close(fd);  
  55.       
  56.     return 0;  
  57.       
  58. }  

    我们要借鉴Linux的文件描述符这个概念,就是open函数返回的值,这个值是进一步操作文件的所需要的值,我们看到在write函数和read函数中的第一个形参都要求传入一个要操作的文件的文件描述符。

    这个值其实是个索引,每个进程的PCB中都有一个文件描述符的指针数组,open函数返回的索引就确定了使用哪个文件描述符,这个数组的大小规定了一个进程能够同时打开多少个文件。内核维护一个文件描述符的结构数组,它的大小确定了所有的进程可以同时打开的不同文件的个数,因为多个进程可以同时打开一个文件,这里理应加入互斥功能,但为了简单起见就不管它。一个文件描述符有3个字段。等会看代码就知道了。

    先修改PCB,加入文件描述符的指针数组:

    include/proc.h

Code:
  1. #define MAX_FILE_PER_PROC   10          /* 每个进程最多可以打开的不同的文件个数 */   
  2.   
  3. ...   
  4. /* 在PCB的定义中追加  */ 
  5. /* 指向全局文件描述符的指针数组 */  
  6. File_Descriptor *fd_ptr_table[MAX_FILE_PER_PROC];   

    然后把每个进程的这个数组都初始化为0,就是空指针,在Init_PCB函数中添加:

    kernel/proc.c

Code:
  1. /* FD的指针数组初始化为0 */  
  2. int j;   
  3. for(j = 0;j < MAX_FILE_PER_PROC;j++)   
  4. {   
  5.     p_Cur_PCB->fd_ptr_table[j] = 0;   
  6. }  

    在添加File_Descriptor的定义:

    include/fs.h

Code:
  1. #define MAX_FILE        20              /* 全部进程同时可打开的不相同的文件 */   
  2.   
  3. /* 文件描述符结构定义 */  
  4. typedef struct s_fd   
  5. {   
  6.     int fd_access_mode;     /* 文件的访问模式,可读还是可写等 */  
  7.     int fd_pos;             /* 读写一个文件的位置指针 */  
  8.     I_Node *fd_inode;       /* 当前文件的i结点指针 */  
  9. }File_Descriptor;  

    再定义一个全局文件描述符数组,分别在include/global.h和kernel/global.c中添加:

Code:
  1. extern  File_Descriptor FD_Table[MAX_FILE];     /* 文件描述符数组 */  
  2.   
  3. File_Descriptor FD_Table[MAX_FILE];      /* 文件描述符数组 */  

    头文件的包含和makefile的修改不赘述。     

    文件描述符数组的初始化日后再说。今天先这样。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值