📄 file.c
字号:
#include "memory.h"
#define WRONG_MEMORY_BODY_ID -1
#define WRONG_MEMORY_PROCESS_ID -2
#define WRONG_CAPABILITY -4
#define OPEN_TOO_MANY_FILE -5
#define NO_FILE_TO_OPEN -6
#define WRONG_FILE_NUMBER -7
#define WRONG_FILE_STATE -8
#define EXIST_BLOCK -9
#define FILE_IS_LOCKED -10
#define CAN_NOT_SET_FILE_CAPABILITY -11
#define WRONG_FILE_WINDOW_ID -12
#define FILE_ALREADY_OPEN -13
int open_file_window(int file_window_id,
struct file_window *file_window,
struct capability *process_capability)
{
int file_id,process_number;
int file_front,file_back;
struct memory_process *p;
struct file_window *f;
process_number=(*(memory_body->process_number));
if(file_window->file.memory_process<0)
return WRONG_MEMORY_PROCESS_ID;
if(file_window->file.memory_process>=process_number)
return WRONG_MEMORY_PROCESS_ID;
p=memory_body->memory_process;
p=p+(file_window->file.memory_process);
if(!KERNEL_COMPARE_CAPABILITY(
(p->capability),(*process_capability)))
return WRONG_CAPABILITY;
if(p->file_number>=p->max_file_number)
return OPEN_TOO_MANY_FILE;
if(file_window_id>=(*(memory_body->file_number)))
return WRONG_FILE_WINDOW_ID;
if(file_window_id>=0){
f=memory_body->file_window+file_window_id;
if(f->state!=FILE_CLOSE)
return FILE_ALREADY_OPEN;
file_id=file_window_id;
}
else
if((file_id=(*(memory_body->free_file)))<0)
return NO_FILE_TO_OPEN;
if(memory_set_file_capability(file_id,file_window->file.right,
&(file_window->file.capability))<0)
return CAN_NOT_SET_FILE_CAPABILITY;
f=memory_body->file_window+file_id;
file_front=f->file_front;
file_back=f->file_back;
if(file_id==file_back)
*(memory_body->free_file)=-1;
else{
if(*(memory_body->free_file)==file_id)
*(memory_body->free_file)=file_back;
(memory_body->file_window+file_front)
->file_back=file_back;
(memory_body->file_window+file_back)
->file_front=file_front;
}
COPY_FILE(file_window->file,f->file);
f->block_ring=-1;
if(p->file_ring<0){
f->file_front=file_id;
f->file_back=file_id;
p->file_ring=file_id;
}else{
int front,back;
struct file_window *f_f,*f_b;
front=p->file_ring;
f_f=(memory_body->file_window+front);
back=f_f->file_back;
f_b=(memory_body->file_window+back);
f->file_front=front;f->file_back=back;
f_f->file_back=file_id;f_b->file_front=file_id;
};
f->lock_number=0;
f->state=FILE_OPEN;
mount_page_table(file_id,f->file.window_length);
p->file_number++;
return file_id;
}
int close_file_window(int file_window_id,
int give_up_flag,int wait_flag,
struct capability *file_capability,int sleep_semaphore)
{
struct physical_block *b;
struct memory_process *p;
struct file_window *f,*f_f,*f_b;
int i,file_front,file_back;
if((i=flush_file_window(give_up_flag,TRUE,wait_flag,
file_window_id,sleep_semaphore,file_capability))<0)
return i;
f=memory_body->file_window+file_window_id;
p=memory_body->memory_process+f->file.memory_process;
if(f->lock_number!=0)
return FILE_IS_LOCKED;
for(;f->block_ring>=0;){
b=memory_body->physical_block;
b=b+f->block_ring;
if((b->state!=NOT_MODIFIED_BLOCK)||(b->lock_number>0))
return EXIST_BLOCK;
else
free_one_block(f->block_ring);
}
file_front=f->file_front;
file_back=f->file_back;
if(file_front==file_window_id)
p->file_ring=-1;
else{
f_f=(memory_body->file_window+file_front);
f_b=(memory_body->file_window+file_back);
f_f->file_back=file_back;
f_b->file_front=file_front;
if(p->file_ring==file_window_id)
p->file_ring=file_back;
}
file_back=(*(memory_body->free_file));
if(file_back<0){
f->file_front=file_window_id;
f->file_back=file_window_id;
*(memory_body->free_file)=file_window_id;
}
else{
f_b=(memory_body->file_window+file_back);
file_front=f_b->file_front;
f_f=(memory_body->file_window+file_front);
f_f->file_back=file_window_id;
f_b->file_front=file_window_id;
f->file_front=file_front;
f->file_back=file_back;
}
unmount_page_table((f->file.memory_process),file_window_id);
f->state=FILE_CLOSE;
memory_set_file_capability(file_window_id,NO_ACCESS_RIGHT,
&(f->file.capability));
p->file_number--;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -