题目描述
小易正在学习操作系统的知识,并且他相信通过实践才能更好地掌握知识,所以他决定自己动手实现—个简化版文件系统。
他想实现的文件系统中最关键的一个概念是文件描述符,在一个进程中,打开的每一个文件都会以文件描述符表示,所以对这个文件进行的操作都是通过文件描述符进行操作。在这个简化版的文件系统中,文件描述符以非负学数表示。
他现阶段所需要文现的函数如下:
1.open(file_name),以文件名作为参数,返回一个新的文件描述符指向文件名为file_name的文件;
2.dup(fd),以一个文件描述符作为参数,返回一个新的文件描述符指向参数fd所指向的文件;
3.dup2(1d, new_fd),以两个文件描述符作为参数,让new_fd指向fd所指向的文件;
4.close(fd),以一个文件描述符作为参数,使fd不再指向任何文件;
5.query(fd),以一个文件描述符作为参数,返回fd所指向的文件的文件名;
这些函数附加说明如下:
1.在open和dup函数中,返回的新的文件描述符会选择一个最小的未指向任何文件的文件描述符;
2.在dup2函数中,new_fd可能原来有指向的文件,也可能未指向任何文件;
3.在所有带有fd作为参数的函数中,fd都保证指向—个文件;
4.在open函数中,保证每次open操作都是成功的,且同一个文件名的文件可以被打开多次;
5.在dup和dup2函数中,文件描述符td所指向的文件不会改变;
6.close只会影响参数fd的文件描述符,不会改变其它文件描述符;
输入描述:
输入第—行为一个正整数T,表示有T组数据。
每组数据的第一行为一个正整数N,表示在这组测试数据中有N次函数调用。
接下来有M行,每行为以下五种格式其中之一:
- open <file_name>
- dup
- dup2 <new_fd>
- close
- query
分别对应描述中的函数。
数据范围:
对于50%数据,满足1<=N<=100;
对于所有数据,满足1<=T<=5,1<=N<=100000,0<=new_fd<=1000000,文件名的最大长度为16个字符,且只包含大小写数母、数字以及这三种符号".-_"。
输出描述:
对于每个open和dup函数调用,输出一行,为返回的文件描述符;对于每个query函数调用,输出一行,为返回的文件名字符串。
输入:
2
10
open libc.so
open libm.so
open libdl.so
dup 2
dup2 0 2
close 0
query 1
query 2
query 3
open log.txt
10
open output.txt
dup2 0 1000000
close 0
open output2.txt
dup2 0 100000
close 0
open 1.txt
dup 100000
query 1
query 0
输出:
0
1
2
3
libm.so
libc.so
libdl.so
0
0
0
0
1
output2.txt
1.txt
```cpp
int open(string file_name ,vector<int> &nums,map<string,vector<int>> & sys){
vector<int> ints;
int i = 0;
while (true)
{
if(find(nums.begin(),nums.end(),i) == nums.end() ){
//没有这个值
break;
}else{
//有这个值
i++;
}
}
string key;
vector<int> temp;
bool flag = false;
for(std::map<string,vector<int>>::iterator it = sys.begin();it!=sys.end();it++)
{
if (it->first == file_name)
{
it->second.push_back(i);
flag = true;
break;
}
}
if (!flag)
{
ints.push_back(i);
nums.push_back(i);
sys.insert(pair<string,vector<int>> (file_name, ints));
}
return i;
}
int dup(int fd,vector<int> &nums,map<string,vector<int>> & sys){
string key;
vector<int> temp;
bool flag = false;
for(std::map<string,vector<int>>::iterator it = sys.begin();it!=sys.end();it++)
{
temp = it->second;
int kk = temp.size();
for (int i = 0;i < kk; i++)
{
if (fd == temp[i])
{
key = it->first;
flag = true;
break;
}
}
if (flag)
{
break;
}
}
int i = 0;
while (true)
{
if(find(nums.begin(),nums.end(),i) == nums.end() ){
//没有这个值
break;
}else{
//有这个值
i++;
}
}
temp.push_back(i);
nums.push_back(i);
if(sys.count(key)>0)
{
sys[key] = temp;
}
return i;
}
void dup2(int fd,int new_fd,map<string,vector<int>> & sys){
string key2;
vector<int> temp2;
bool flag = false;
for(std::map<string,vector<int>>::iterator it = sys.begin();it!=sys.end();it++)
{
temp2 = it->second;
int kk = temp2.size();
for (int i = 0;i < kk; i++)
{
if (new_fd == temp2[i])
{
key2 = it->first;
flag = true;
break;
}
}
if (flag)
{
break;
}
}
for (vector<int>::iterator it = temp2.begin(); it != temp2.end(); )
{
if (*it==new_fd)
{
temp2.erase(it);
break;
}
else
{
++it;
}
}
if(sys.count(key2)>0)
{
sys[key2] = temp2;
}
string key;
vector<int> temp;
flag = false;
for(std::map<string,vector<int>>::iterator it = sys.begin();it!=sys.end();it++)
{
temp = it->second;
int kk = temp.size();
for (int i = 0;i < kk; i++)
{
if (fd == temp[i])
{
key = it->first;
flag = true;
break;
}
}
if (flag)
{
break;
}
}
temp.push_back(new_fd);
if(sys.count(key)>0)
{
sys[key] = temp;
}
}
void close(int fd,vector<int> &nums,map<string,vector<int>> & sys){
string key2;
vector<int> temp2;
bool flag = false;
for(std::map<string,vector<int>>::iterator it = sys.begin();it!=sys.end();it++)
{
temp2 = it->second;
int kk = temp2.size();
for (int i = 0;i < kk; i++)
{
if (fd == temp2[i])
{
key2 = it->first;
flag = true;
break;
}
}
if (flag)
{
break;
}
}
for (vector<int>::iterator it = temp2.begin(); it != temp2.end(); )
{
if (*it==fd)
{
temp2.erase(it);
break;
}
else
{
++it;
}
}
if(sys.count(key2)>0)
{
sys[key2] = temp2;
}
for (vector<int>::iterator it = nums.begin(); it != nums.end(); )
{
if (*it==fd)
{
nums.erase(it);
break;
}
else
{
++it;
}
}
}
string query(int fd,map<string,vector<int>> & sys){
string key2;
vector<int> temp2;
bool flag = false;
for(std::map<string,vector<int>>::iterator it = sys.begin();it!=sys.end();it++)
{
temp2 = it->second;
int kk = temp2.size();
for (int i = 0;i < kk; i++)
{
if (fd == temp2[i])
{
key2 = it->first;
flag = true;
break;
}
}
if (flag)
{
break;
}
}
return key2;
}
void main(){
vector<int> nums;
map<string,vector<int>> sys;
cout<<open("1.txt",nums, sys)<<endl;
dup2(0,1000000,sys);
close(0,nums, sys);
cout<<open("2.txt",nums, sys)<<endl;
dup2(0,100000,sys);
close(0, nums,sys);
cout<<open("3.txt",nums, sys)<<endl;
cout<<dup(100000, nums, sys)<<endl;
cout<<query(1,sys)<<endl;
cout<<query(0,sys)<<endl;
}