c++ 模拟unix系统Funix


FUNIX 代码


#ifndef FUNIX_H
  #define FUNIX_H

#include "directory.h"

const int COMMAND_LENGTH  = 80;
const int NUM_COMMANDS = 5;
const int MAX_ARGUMENTS = 40;

class Funix
{
  Directory *currentDirectory;
  int umask;
  int time;
  void cd(int argCount, const char *arguments[]);
    // calls cd() with currentDirectory as one of its parameters
  int eXit(int argCount, const char *arguments[]) const;
    // checks "exit" command, returns 0 on proper exit
  void getCommand(char *command);
    // writes prompt and reads command
  void ls(int argCount, const char *arguments[]) const;
    // calls ls() with currentDirectory as one of its parameters
  void mkdir(int argCount, const char *arguments[]);
    // calls mkdir() with currentDirectory as one of its parameters
  int processCommand(char *command);  // returns 0 on proper exit
  void setUmask(int argCount, const char *arguments[]);
    // checks "umask" command and executes it if it is proper
  void writePrompt() const;  // shows path and '#'
  
public:
    Funix();
    // creates currentDirectory, and sets umask and time
    void run();
    // reads and processes commands in a loop until proper exit
    ~Funix();
};


#endif
#ifndef FUNIX_H
  #define FUNIX_H

#include "directory.h"

const int COMMAND_LENGTH  = 80;
const int NUM_COMMANDS = 5;
const int MAX_ARGUMENTS = 40;

class Funix
{
  Directory *currentDirectory;
  int umask;
  int time;
  void cd(int argCount, const char *arguments[]);
    // calls cd() with currentDirectory as one of its parameters
  int eXit(int argCount, const char *arguments[]) const;
    // checks "exit" command, returns 0 on proper exit
  void getCommand(char *command);
    // writes prompt and reads command
  void ls(int argCount, const char *arguments[]) const;
    // calls ls() with currentDirectory as one of its parameters
  void mkdir(int argCount, const char *arguments[]);
    // calls mkdir() with currentDirectory as one of its parameters
  int processCommand(char *command);  // returns 0 on proper exit
  void setUmask(int argCount, const char *arguments[]);
    // checks "umask" command and executes it if it is proper
  void writePrompt() const;  // shows path and '#'
  
public:
    Funix();
    // creates currentDirectory, and sets umask and time
    void run();
    // reads and processes commands in a loop until proper exit
    ~Funix();
};


#endif
#ifndef DIRECTORY_H
  #define DIRECTORY_H

#include "permissions.h"

const int MAX_DIRECTORIES = 3;

class Directory
{

  int time;
  Directory **subDirectories;
  int subDirectoryCount;
  Directory *parent;
  Permissions permissions;
  char *name;
    
public:
  Directory(const char *nam, short umas,
            int tim, Directory *paren);
  ~Directory();
    
  void showPath(Directory *dir) const;
  void mkdir(int argCount, const char *arguments[],
             short umas, int tim);
  void ls(int argCount, const char *arguments[]) const;
  Directory* cd(int argCount, const char *arguments[]);
    
    
};





#endif  // DIRECTORY_H
#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include "directory.h"
using namespace std;

Directory::Directory(const char *nam, short umas,
                     int tim, Directory *paren): time(tim),
                     subDirectories(NULL),
                     subDirectoryCount(0), parent(paren)
{
    name = new char(strlen(nam) + 1);
    strcpy(name, nam);
    permissions.set(7, umas);
}  // constructor!! oh yeah

Directory::~Directory()
{
    delete name;
    for (int i = 0; i < subDirectoryCount; i++)
      delete subDirectories[i];
    delete [] subDirectories;
    
}

Directory* Directory::cd(int argCount, const char *arguments[])
{
  if (argCount != 2)
  {
    cout<<"usage: cd directoryName\n";
    return this;
  }  // if too many arguments

  if (strcmp(arguments[1], "..") == 0)
  {
    if (parent)
      return parent;
    else  // this is root
      return this;
  }  // if cd ..

  for (int i = 0; i < subDirectoryCount; i++)
  {
     if (strcmp(subDirectories[i]->name, arguments[1]) == 0)
       return subDirectories[i];
  }  // for each subdirectory
 
  cout<<"cd: "<
      
      
       
       <<": No such file or directory\n";
  return this;
}  // cd()


void Directory::ls(int argCount, const char *arguments[]) const
{
  if (argCount > 2 || (argCount == 2 && strcmp(arguments[1], "-l") != 0))
    cout<<"usage: ls [-l]\n";
  else  // correct number of arguments
  {
    if (argCount == 1)  // simple ls
    {
      for (int i = 0; i < subDirectoryCount; i++)
        cout<
       
       
         name<<" "; cout<<"\n"; } // if simple ls else // must be ls -l { for (int i = 0; i < subDirectoryCount; i++) { subDirectories[i]->permissions.print(); cout<<" "< 
        
          time<< " "< 
         
           name< 
          
            name, arguments[1]) == 0) { cout<<"mkdir: cannot create directory '"< 
           
             <<"': File exists\n"; return; } // if subdirectory already exists. } // for each subdirectory Directory **subDirectoriesTemp = new Directory *[subDirectoryCount + 1]; memcpy(subDirectoriesTemp,subDirectories,subDirectoryCount*sizeof(Directory *)); delete [] subDirectories; subDirectories = subDirectoriesTemp; subDirectories[subDirectoryCount] = new Directory(arguments[1], umas, tim, this); subDirectoryCount++; } // mkdir() void Directory::showPath(Directory *dir) const { if (dir->parent == NULL) { cout<<"/"; return; } // at root Directory::showPath(dir->parent); cout< 
            
              name<<"/"; } // showPath()) #ifndef PERMISSIONS_H #define PERMISSIONS_H class Permissions { short permissions; public: void print() const; void set(short originalPermissions, short umask); }; #endif // PERMISSIONS_H #include 
             
               #include "permissions.h" using namespace std; void Permissions::set(short originalPermissions, short umask) { permissions = originalPermissions & ~umask; } // set() void Permissions::print() const { if (permissions & 4) cout<<"r"; else // no read permissions cout<<"-"; if (permissions & 2) cout<<"w"; else // no write permissions cout<<"-"; if (permissions & 1) cout<<"x"; else // no execute permissions cout<<"-"; } // print() #include 
              
                #include "funix.h" int main() { Funix *funix = new Funix; funix->run(); delete funix; } // main() 
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.本题目为模拟UNIX文件系统来设计一个多用户多级目录的文件系统。 1)课程设计所利用的空间为1M的内存(模拟外存文件系统存储空间)或用一个文件模拟一个磁盘分区,模拟外存文件系统存储空间。这1M内存分成512块,每块为512个字节,这512块就是文件系统总共的可用块数,文件系统的分配就是以块为单位来分配的,空闲块的管理利用位示图的方法来管理。申请1M的内存的方法可以利用malloc()等。 2)在构造文件系统空间时,不用做引导块;专用块中只包含对空闲块和空闲磁盘i节点进行管理的信息,即位示图和记录空闲磁盘i节点号的数组(该数组大小可设置为与磁盘i节点总数相等);要做磁盘i节点区和文件存储区;不用做进程对换区。注意:仔细计算,合理分配各区域。 3)磁盘i节点可以利用在内存中生成链表或者数组的方法来生成,并且限制磁盘i节点数的最大值。同样内存活动i节点也可以利用链表的方法在内存中生成。 4)在往文件中写或者读的时候我们都是对内存中内容进行读写。例如你在文件中写的时候,其实是对分配的文件块中对应的内存赋值。当程序运行结束的时候,文件的内容都会丢失。我们这个文件系统只是一个模拟文件系统功能的虚拟文件系统。当然,若用一个文件模拟一个磁盘分区,模拟外存文件系统存储空间,那你在这个模拟系统中建立的文件其内容就不会丢失了 本程序使用txt文件模拟磁盘分区
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值