Linux 文件系统实现代码

这是一个用C++实现的Linux文件系统模拟程序,包括文件、目录的创建、删除、读写,权限管理,以及基本的命令操作如ls、pwd、cd等。程序通过模拟磁盘存储、数据块、inode节点、目录项等核心概念,实现了文件系统的部分功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * main.cpp
 *
 * 
 */
#include <iostream>
#include <stdlib.h>
#include<string.h>
#include<curses.h>
using namespace std;
typedef struct User
{
	string name[30];
	string passwd[30];
	int n;
} User, u;
typedef struct Priv
{
	char read;
	char write;
	char execute;
} Priv, priv[3];
//记录文件信息。name表示第几块,用disk模拟
typedef struct DataStock
{
	int name;  //第几盘块号
	int stock_num;
	struct DataStock *next;
} DataStock, *ds;
// 一个节点信息,可能是一个目录或者一个文件。
// 如果是一个目录,那么下面会有子目录childnode, inode_num,
//记录子目录项的数目
typedef struct Inode
{
	int inode_num;
	int type; 			//文件类型,文件/目录  0/1
	float size;
	Priv *priv;
	char* owneruser;
	struct tm *createtime;
	struct Inode** childnode;
	struct DataStock *datastock;
} Inode;
//一个目录项,
typedef struct Dentry
{
	string name;
	struct Inode *inode;
} Dentry;

int number = 1000;

//默认路径是/home, 用户名是" ".
string rootDirect = "/home";
string currentUser = " ";
string currentPath = rootDirect;

User user;
Dentry dentry[1000];
int of_record = 0;
int record = -1;


//磁盘块
int disk_record = 0;//记录使用了多少磁盘块
int disk_stock = 3; //三个字节为一个盘块
string *disk = new string[number]; //模拟磁盘存储  1000个磁盘块
int firstempty = 0;

// 命令行
int command_number = 10;
int command_record = 0;
string *commandsave = new string[command_number];
int umask_direct = 775;
int umask_file = 664;
void test()
{
	for (int i = 0; i < disk_record; i++)
	{
		cout << disk[i];
	}
}
void showDisk()
{
	for (int i = 0; i < disk_record; i++)
	{
		cout << "第" << i << "个磁盘块:" << disk[i] << endl;
	}
}
void output()
{
	cout << "[" << currentUser << "@" << "localhost" << currentPath << "]#";
}
//数据块节点初始化
DataStock *initializeStock()
{
	DataStock *head;
	head = (DataStock*) malloc(sizeof(DataStock));
	head->name = -1;
	head->next = NULL;
	return head;
}
//inode节点初始化
// 跟踪 // initalizeInode(1,"home",-1)
Inode *initializeInode(int type, string u, int p)
{
	Inode *inode = NULL;
	inode = (Inode*) malloc(sizeof(Inode));
	inode->childnode = (Inode**) malloc(100 * sizeof(Inode*));
	inode->inode_num = 0;
	inode->type = type;
	inode->datastock = initializeStock();
	inode->size = 0;
	if(p == 0)
		inode->owneruser = (char*) u.data();
	else
		inode->owneruser = (char*) currentUser.data();
	time_t ctime;
	time(&ctime);
	inode->createtime = localtime(&ctime);
//权限初始化
	Priv *priv = (Priv*) malloc(sizeof(Priv));
	if(type == 0) //文件
	{
		priv[0].read = 'r';
		priv[0].write = 'w';
		priv[0].execute = '-';
		priv[1].read = 'r';
		priv[1].write = 'w';
		priv[1].execute = '-';
		priv[2].read = 'r';
		priv[2].write = '-';
		priv[2].execute = '-';
	}
	else
	{ //目录
		priv[0].read = 'r';
		priv[0].write = 'w';
		priv[0].execute = 'x';
		priv[1].read = 'r';
		priv[1].write = 'w';
		priv[1].execute = 'x';
		priv[2].read = 'r';
		priv[2].write = '-';
		priv[2].execute = '-';
	}
	inode->priv = priv;
	return inode;
}
//根据目录项名字找对应的目录项
Dentry findDentry(char *dentryname)
{
	Dentry temp;
	for (int i = 0; i <= record; i++)
	{
		if(strcmp((char*) dentry[i].name.data(), dentryname) == 0)
		{
			temp = dentry[i];
			break;
		}
	}
	return temp;
}
//根据inode节点找相对应的目录项
Dentry searchDentry(Inode *inode)
{

	Dentry temp;
	for (int i = 0; i <= record; i++)
	{
		if(dentry[i].inode == inode)
		{
			temp = dentry[i];
			break;
		}
	}
	return temp;
}
//得到当前路径,如/home/root/sxw,最终返回结果为sxw
// i+1 - endname.size() 为路径名
int getEndPath(string endname)
{
	std::cout<<"endname = "<<endname<<std::endl;
	int i = 0;
	for (i = endname.size(); i >= 0; i--)
	{
		if(endname[i] != '/')
		{
			continue;
		}
		break;
	}
	return (i + 1);
}
int judge(string path)
{

	int
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值