os操作系统实验指导(8)

2019-08-31 15:43

{

int i=0,inodeid; long addr;

unsigned int block_num; struct inode temp;

inodeid = pinode->i_ino%NHINO;

if (pinode->i_count>1) { pinode->i_count--; return 1; } else

{ if (pinode->di_number!=0) { /* write back the inode */

addr=DINODESTART+pinode->i_ino*sizeof(struct dinode);

fseek(fd,addr,SEEK_SET);

fread(&(temp.di_number),sizeof(struct dinode),1,fd); }

fseek(fd,addr,SEEK_SET);

fwrite(&(pinode->di_number),sizeof(struct dinode),1,fd);

else {

/* rm the inoide & the block of the file in the disk */ block_num=pinode->di_size/BLOCKSIZ; for(i=0;idi_addr[i]); ifree(pinode->i_ino); }

/*free the inode in the memory */ if (pinode->i_forw==NULL) pinode->i_back->i_forw=NULL; else {

pinode->i_forw->i_back=pinode->i_back; pinode->i_back->i_forw=pinode->i_forw; }

if(pinode->i_back == pinode) //hash表中该列剩下最后一个inode

hinode[inodeid].i_forw = NULL; free(pinode); }

return 0;

}

8、节点分配和释放函数ialloc( )和ifree( ) ( 文件名iallfre.c)

#include \#include \

static struct dinode block_buf[BLOCKSIZ/DINODESIZ];

struct inode *ialloc( ) /*ialloc */ { struct inode *temp_inode; unsigned int cur_di; int i,count,block_end_flag;

if (filsys.s_pinode==NICINOD) /*s_inode empty */ { i=0; count=0;

block_end_flag=1;

filsys.s_pinode=NICINOD-1; cur_di=filsys.s_rinode;

while ((count

{ fseek(fd,DINODESTART+cur_di*DINODESIZ,SEEK_SET); fread(block_buf,1,BLOCKSIZ,fd); block_end_flag=0; i=0; }

while (block_buf[i].di_mode==DIEMPTY) { cur_di++; i++; }

if (i==NICINOD) block_end_flag=1; else

{ filsys.s_inode[filsys.s_pinode--]=cur_di; count++; } }

filsys.s_rinode=cur_di; }

temp_inode=iget(filsys.s_inode[filsys.s_pinode]);//分配内存i节点 temp_inode->i_ino = filsys.s_inode[filsys.s_pinode]; //设置磁盘i节点号

fseek(fd,DINODESTART+filsys.s_inode[filsys.s_pinode]*sizeof(struct dinode),SEEK_SET);

fwrite(&temp_inode->di_number,1,sizeof(struct dinode),fd);

++ filsys.s_pinode;

-- filsys.s_ninode; //磁盘i结点总数-1,置超级块修改标志,返回 filsys.s_fmod=SUPDATE;

return temp_inode; }

ifree(dinodeid) /*ifree*/ unsigned dinodeid; { filsys.s_ninode++;

if (filsys.s_pinode!=NICINOD) /*not full*/ { filsys.s_inode[filsys.s_pinode]=dinodeid; filsys.s_pinode++; }

else /*full*/ if (dinodeid

{ filsys.s_inode[NICINOD]=dinodeid; filsys.s_rinode=dinodeid; } }

9、磁盘块分配与释放函数balloc( )与bfree( ) (文件名ballfre.c)

#include \#include \

static unsigned int block_buf[BLOCKSIZ]; unsigned int balloc( )

{ unsigned int free_block,free_block_num; int i;

if (filsys.s_nfree==0) { printf(\ return DISKFULL; }

free_block=filsys.s_free[filsys.s_pfree]; if(filsys.s_pfree==NICFREE-1) {

fseek(fd,DATASTART+BLOCKSIZ*(iCur_free_block_index+NICFREE-1),SEEK_SET);

fread(block_buf,1,BLOCKSIZ,fd);

free_block_num=block_buf[NICFREE]; /*the total block num in the group */ for(i=0;i

filsys.s_free[NICFREE-1-i]=block_buf[i]; filsys.s_pfree=NICFREE-free_block_num; }

else filsys.s_pfree+=1; filsys.s_nfree-=1; filsys.s_fmod=SUPDATE; return free_block; }

bfree(block_num) unsigned int block_num; {

int i;

if(block_num>=0&&block_num<=3) return;

if (filsys.s_pfree==0&&iCur_free_block_index!=11) /*s_free full */

filsys.s_pfree-=1; {

block_buf[NICFREE]=NICFREE; for(i=0;i

block_buf[i]=filsys.s_free[NICFREE-1-i]; filsys.s_pfree=NICFREE-1; }

if(iCur_free_block_index!=11) { iCur_free_block_index-=NICFREE;

fseek(fd,DATASTART+BLOCKSIZ*(iCur_free_block_index-1),SEEK_SET); fread(block_buf,1,BLOCKSIZ,fd); filsys.s_nfree++; filsys.s_fmod=SUPDATE; } }

10、搜索函数namei( )和iname( ) ( 文件名name.c)

#include \#include \#include \

unsigned int namei(name) /*namei 目录搜索函数*/ char *name;

{ int i,notfound=1;

for(i=0;((i

return i;

return NULL; /*not find*/ };

unsigned short iname(name) /*iname */ char *name;

{ int i,notfound=1;

for(i=0;((i

if (notfound)

{ printf(\ return 0; } else {

strcpy(dir.direct[i].d_name,name); return i; } }

((!strcmp(dir.direct[i].d_name,name))

&&(dir.direct[i].d_ino!=0))

11、访问控制函数access( ) ( 文件名access.c) #include \

#include \

unsigned int access(user_id,inode,mode) unsigned int user_id; struct inode *inode; unsigned short mode; { int j,k;

for(j=0;j

if(user[j].u_uid == user_id) { k=j; break; }


os操作系统实验指导(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:六年级下册英语素材-英语名词单复数变化规律及练习题 - 通用版

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: