操作系统课程设计-成组链接模拟unix文件系统 第2页

void write_file(FILE *fp)    //将信息读入系统文件中
{
 int i;
 fp=fopen("system","wb");
 for(i=0;i<20449;i++)
 {
  fwrite(&memory[i],sizeof(struct block),1,fp);
 }
 fwrite(&super_block,sizeof(struct block_super),1,fp);

 for(i=0;i<640;i++)
 {
 fwrite(&i_node[i],sizeof(struct node),1,fp);
 }
 for(i=0;i<640;i++)
 {
 fwrite(&root[i],sizeof(struct dir),1,fp);
 }
 fclose(fp);
}

void read_file(FILE *fp)   //读出系统文件的信息
{
 int i;
 fp=fopen("system","rb");
 for(i=0;i<20449;i++)
 {
  fread(&memory[i],sizeof(struct block),1,fp);
 }

 fread(&super_block,sizeof(struct block_super),1,fp);

 for(i=0;i<640;i++)
 {
  fread(&i_node[i],sizeof(struct node),1,fp);
 }

 for(i=0;i<640;i++)
 {
  fread(&root[i],sizeof(struct dir),1,fp);
 }
 fclose(fp);
}

void callback(int length)    //回收磁盘空间
{
 int i,j,k,m,q=0;
 for(i=length-1;i>=0;i--)
 {
  k=physic[i];     //需要提供要回收的文件的地址
  m=49-super_block.n;    //回收到栈中的哪个位置
  if(super_block.n==50)   //注意 当super_block.n==50时 m=-1;的值
  {        //super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中
   for(j=0;j<50;j++)
   {
    memory[k].free[j]=super_block.free[j];
   }
   super_block.n=0;
   memory[k].n=50;
  }
  memory[k].a=0; 
  if(m==-1)
  {
   m=49;      //将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息 
  }
  super_block.free[m]=physic[i]; //将下一个文件地址中的盘块号回收到栈中
  super_block.n++;
 }
}

void allot(int length)     //分配空间
{
 int i,j,k,m,p;
 for(i=0;i<length;i++)
 {
  k=50-super_block.n;    //超级块中表示空闲块的指针
  m=super_block.free[k];   //栈中的相应盘块的地址
  p=super_block.free[49];   //栈中的最后一个盘块指向的地址
  if(m==-1||memory[p].a==1)  //检测是否还有下一组盘块
  {
   printf("内存不足,不能够分配空间\n");
   callback(length);
   break;
  }
  if(super_block.n==1)
  {  
   memory[m].a=1;    //将最后一个盘块分配掉
   physic[i]=m;
   super_block.n=0;  
   for(j=0;j<memory[m].n;j++) //从最后一个盘块中取出下一组盘块号写入栈中
   { 
    super_block.free[j]=memory[m].free[j];
    super_block.n++;
   }
   continue;     //要跳过这次循环,下面的语句在IF中已经执行过
  }
  physic[i]=m;     //栈中的相应盘块的地址写进 文件地址缓冲区
  memory[m].a=1;  
  super_block.n--;
 }
}

void create_file(char filename[],int length) //创建文件
{
 int i,j;
 for(i=0;i<640;i++)
 {
  if(strcmp(filename,root[i].file_name)==0)
  {
   printf("文件已经存在,不允许建立重名的文件\n");
   return;
  }
 }
 for(i=0;i<640;i++)
 {
   if(root[i].i_num==-1)
   {
    root[i].i_num=i;
    strcpy(root[i].file_name,filename);
    strcpy(root[i].dir_name,cur_dir);  //把当前目录名 给新建立的文件
    i_node[i].file_style=style;
    i_node[i].file_length=length;
    allot(length);
    for(j=0;j<length;j++)
    {
     i_node[i].file_address[j]=physic[j];
    }
    break;
   }
 }
}

void create_dir(char filename[])    //创建目录
{
 style=0;         //0代表文件类型是目录文件
 create_file(filename,4);
 style=1;         //用完恢复初值,因为全局变量,否则
}

上一页  [1] [2] [3] [4] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有