-
Notifications
You must be signed in to change notification settings - Fork 9
/
File.cpp
63 lines (52 loc) · 1.34 KB
/
File.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "Utility.h"
#include "File.h"
#include "User.h"
extern User g_User;
File::File() {
flag = 0;
count = 0;
inode = NULL;
offset = 0;
}
File::~File() {
}
OpenFiles::OpenFiles() {
Utility::memset(processOpenFileTable, NULL, sizeof(processOpenFileTable));
}
OpenFiles::~OpenFiles() {
}
/* 进程请求打开文件时,在打开文件描述符表中分配一个空闲表项 */
int OpenFiles::AllocFreeSlot() {
User& u = g_User;
for (int i = 0; i < OpenFiles::MAX_FILES; i++) {
/* 进程打开文件描述符表中找到空闲项,则返回之 */
if (this->processOpenFileTable[i] == NULL) {
u.ar0[User::EAX] = i;
return i;
}
}
u.ar0[User::EAX] = -1; /* Open1,需要一个标志。当打开文件结构创建失败时,可以回收系统资源*/
u.u_error = User::U_EMFILE;
return -1;
}
/* 根据用户系统调用提供的文件描述符参数fd,找到对应的打开文件控制块File结构 */
File* OpenFiles::GetF(int fd) {
User& u = g_User;
File* pFile;
if (fd < 0 || fd >= OpenFiles::MAX_FILES) {
u.u_error = User::U_EBADF;
return NULL;
}
pFile = this->processOpenFileTable[fd];
if (pFile == NULL) {
u.u_error = User::U_EBADF;
}
return pFile;
}
/* 为已分配到的空闲描述符fd和已分配的打开文件表中空闲File对象建立勾连关系 */
void OpenFiles::SetF(int fd, File* pFile) {
if (fd < 0 || fd >= OpenFiles::MAX_FILES) {
return;
}
this->processOpenFileTable[fd] = pFile;
}