📄 openclo.c
字号:
/************************************************/
/* */
/* openclose.c */
/* */
/************************************************/
#include <stdio.h>
#include "filsys.h"
int open( char * filename, unsigned short openmode )
{
unsigned int dinodeid;
struct inode * inode;
int i, j;
/* 检索目录 */
dinodeid = namei( filename );
if( dinodeid == NULL ) /* no such file */ //作过修改
{
if( openmode & O_CREAT )
return creat( filename, openmode );
printf( "File does not existed\n" );
return -1;
}
/* 分配内存i节点 */
inode = iget( dinodeid );
if( !access( inode )) /* access denied */
{
printf( "File open has not access\n" );
iput( inode );
return -1;
}
/* 分配文件表项 */
for( i = 0; i < SYSOPENFILE; i++ )
{
if( sys_ofile[i].f_count == 0 )
break;
}
if( i == SYSOPENFILE )
{
printf( "System open file too much\n" );
iput( inode );
return -1;
}
/* 分配用户文件描述表项 */
for( j = 0; j < NOFILE; j++ )
if( user[user_id].u_ofile[j] == SYSOPENFILE + 1 )
break;
if( j == NOFILE )
{
printf( "user open file too much\n" );
iput( inode );
return -1;
}
sys_ofile[i].f_inode = inode;
sys_ofile[i].f_flag = openmode;
sys_ofile[i].f_count++;
/* 读/写指针置位 */
if( openmode & O_APPEND )
sys_ofile[i].f_off = inode->i_size; /* 读/写指针置于文件尾 */
else
sys_ofile[i].f_off = 0; /* 读/写指针置于文件开始位置 */
user[user_id].u_ofile[j] = i;
/* 将原来存在的文件清空 */
if( openmode & O_TRUNC )
{
for( i = 0; i < inode->i_size / BLOCKSIZ + 1; i++ )
bfree( inode->i_addr[i] );
inode->i_size = 0;
}
return j;
}
close( int cfd )
{
int sys_ip;
/* 获得指向文件表项的指针sys_ip */
sys_ip = user[user_id].u_ofile[cfd];
/* 释放内存i节点 */
iput( sys_ofile[sys_ip].f_inode );
/* 文件表项引用计数减1 */
sys_ofile[sys_ip].f_count--;
/* 清空用户打开表 */
user[user_id].u_ofile[cfd] = SYSOPENFILE + 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -