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;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;i 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)
2019-08-31 15:43
os操作系统实验指导(10).doc
将本文的Word文档下载到电脑
下载失败或者文档不完整,请联系客服人员解决!