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

2019-08-31 15:43

for(user_p=0;user_p

k=user_p;

di_ino=namei(filename);

if (di_ino!=NULL) /*already existed*/ { inode=iget(di_ino);

if(access(user_id,inode,mode)==0) { iput(inode);

printf(\ return ; }

/*free all the block of the old file */ for(i=0;idi_size/BLOCKSIZ+1;i++) bfree(inode->di_addr[i]);

/*to do: add code here to update the pointer of the sys_file*/ for(i=0;i

if (sys_ofile[i].f_inode==inode) sys_ofile[i].f_off=0;

for(i=0;i

if (user[k].u_ofile[i]= SYSOPENFILE+1) { user[k].u_uid=inode->di_uid; user[k].u_gid=inode->di_gid; for(j=0;j

user[k].u_ofile[i]=j; sys_ofile[j].f_flag=mode; }

return i; } }

else /*not existed before */ {

inode=ialloc( ); di_ith=iname(filename);

break; }

dir.size++;

dir.direct[di_ith].d_ino=inode->i_ino;

inode->di_mode=user[k].u_default_mode|DIFILE; inode->di_uid=user[k].u_uid; inode->di_gid=user[k].u_gid; inode->di_addr[0]=balloc(); inode->di_size=0; inode->di_number=1;

for (i=0;i

for(j=0;j

if (user[k].u_ofile[j]==SYSOPENFILE+1) break;

user[k].u_ofile[j]=i; sys_ofile[i].f_flag=mode; sys_ofile[i].f_count=0; sys_ofile[i].f_off=0; sys_ofile[i].f_inode=inode; return j; } }

14、打开文件函数open( ) (文件名open.c)

#include \#include \

unsigned short open(user_id,filename,openmode) int user_id; char *filename;

unsigned short openmode; { unsigned int dirid; struct inode *inode; int i,j,k;

dirid=namei(filename);

if (dirid==NULL) /*no such file */

{ printf(\ return NULL; }

inode=iget(dir.direct[dirid].d_ino);

if (!access(user_id,inode,openmode)) /*access denied*/ { printf(\ iput(inode); return NULL; }

/* alloc the sys_ofile item*/ for(i=1;i

if (sys_ofile[i].f_count==0) break; if (i==SYSOPENFILE)

{ printf(\ iput(inode); return NULL; }

sys_ofile[i].f_inode=inode; sys_ofile[i].f_flag=openmode; sys_ofile[i].f_count=1; if (openmode&FAPPEND)

sys_ofile[i].f_off=inode->di_size; else

sys_ofile[i].f_off=0;

/*alloc the user open file item*/ for(j=0;j

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

for(j=0;j

if (user[k].u_ofile[j]==SYSOPENFILE+1) break;

if (j==NOFILE)

{ printf(\ sys_ofile[i].f_count=0; iput(inode); return NULL; }

user[k].u_ofile[j]=i;//记录用户打开的文件在sys_ofile[ ]中的位置

/*if APPEND,free the block of the file before*/

if (openmode &FAPPEND)

{ for(i=0;idi_size/BLOCKSIZ+1;i++) bfree(inode->di_addr[i]); inode->di_size=0; } return j; }

15、关闭文件函数close( ) ( 文件名close.c) #include \

#include \

close(user_id,cfd) /*close*/ unsigned int user_id; unsigned short cfd; { struct inode *inode; int j,k;

for(j=0;j

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

inode=sys_ofile[user[k].u_ofile[cfd]].f_inode;

iput(inode);

sys_ofile[user[k].u_ofile[cfd]].f_count--; user[k].u_ofile[cfd]=SYSOPENFILE+1; }

16、删除文件函数 delete( ) (文件名delete.c)

#include \#include \delete(filename) char *filename;

{ unsigned int dirid; struct inode *inode; int iReturn_value; int i;

dirid=namei(filename);

if (dirid!=NULL)

inode=iget(dir.direct[dirid].d_ino);

inode->di_number--;

iReturn_value=iput(inode); if(iReturn_value=1) {

//删除目录项

for(;dirid<=dir.size-1;dirid++)

strcpy(dir.direct[dirid].d_name,\ dir.direct[dirid].d_ino=0;

if((strcmp(dir.direct[dirid+1].d_name,\ {

} else

printf(\has not been deleted\\n\}

dir.size=dir.size-1;

memcpy(&dir.direct[dirid],&dir.direct[dirid+1],sizeof(struct direct)); }

memset(&dir.direct[dirid+1],0,sizeof(struct direct));

17、读写文件函数read( )与write( ) (文件名 rdwt.c)

#include \#include \

unsigned int read(user_id,fd_1,buf,size) unsigned int user_id; int fd_1; char *buf;

unsigned int size; {

unsigned long off;

int block,block_off,i,j,k; struct inode *inode; char temp_buf[size]; char *temp;

temp = temp_buf;


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

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

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

马上注册会员

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