操作系统课程设计-成组链接模拟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; //用完恢复初值,因为全局变量,否则
}