毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 课程设计 >> 正文

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

更新时间:2007-10-30:  来源:毕业论文

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] 下一页

操作系统课程设计-成组链接模拟unix文件系统 第2页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。