好家伙

 

1. 题目要求

一、   课程设计(大作业)目的

熟悉Linux编程环境,加强对Linux命令的理解及函数的运用,完成一个操作系统的部分系统的设计过程、编码、调试,锻炼实际应用能力。

二、   课程设计(大作业)具体要求

2.1 课程设计题目

在Linux环境下模拟实现简单命令解释器。

(1)要求实现的基本命令包括:

pwd                  //显示当前所在目录的路径名

list  <目录名>          //列出指定目录名中的所有目录及文件

modifydir  <目录名或路径>   //改变当前工作目录

makedir  <目录名>     //新建目录

deldir  <目录名>      //删除目录

exit                 //退出命令解释程序

(2)可选做的扩展命令包括:

   rename  <旧文件名> <新文件名>  //重命名一个文件或目录

   copy  <已存在的文件名> <副本文件名或路径>  //复制一个已存在的文件

   find <目录> -name <待查找的文件名> //在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径。

(3)提示:整个程序的大致框架可参考如下:

         while ( exit未被输入 )

{   接收键盘的一行输入

    分析输入的命令

对输入的命令进行处理,调用系统函数实现功能

         }

2.2 设计要求

    (1) 设计必须在Linux环境下进行。

(2) 命令解释程序的提示符为:姓名拼音@  

(3) 程序编写中不得使用system()系统调用。

(4) 整个程序必须严格经过测试,完成所有基本功能。源程序应有较详尽的注释。

 

2.3可能用到的系统函数:

open(),close(),read(),write(),creat()

chdir(), opendir(),readdir(),rewinddir(),closedir(),rmdir(),mkdir()

    getcwd(),  ftw()

2.思路以及代码

看上去非常难,实际上只需要把关键函数再封装一遍就好了

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<dirent.h>
#include<fcntl.h>
#include<time.h> using namespace std; int C_fd; //文件描述符
char filename[100]; //文件名
int isopen = 0; //打开状态
char *pargv[5] = {"ls", "-l", NULL, NULL};
char findFileName[50]={""}; //用于存放要查找的文件名
int fileFlag = 0; //用于标记是否找到查找的文件名
int num=0;
string file; //显示当前所在目录的路径名 mypwd
void mypwd() {
char path[100];
getcwd(path,100);
cout<<"当前目录: "<<path<<endl;
} //列举指定目录中的所有目录及文件 mylist
//用函数opendir()打开目录,并且用readdir()函数读取每一个目录节点,打印输出信息,最后用函数closer()关闭
bool mylist(string dir) {
DIR* d = opendir(dir.c_str());
if(d==NULL) {
return false;
} else {
struct dirent *dirent;
while(dirent=readdir(d)) {
cout<<endl;
cout<<" "<<dirent->d_name<<" "<<dirent->d_type<<" "<<dirent->d_reclen<<endl;
cout<<endl;
}
closedir(d);
return true;
}
} //显示当前日期-mydate
void date()
{
time_t timeval;
(void)time(&timeval);
string timestr;
// invoke the ctime fuction and return the string
timestr = ctime(&timeval);
cout<<"当前时间: "<<timestr<<endl;
} // 改变当前目录-mycd
bool mycd(string path) {
if(chdir(path.c_str())==0) {
return true;
} else {
return false;
}
} //新建目录-mymkdir
bool mymkdir(string dir) {
if(mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)==0) {
return true;
} else {
return false;
}
} //删除目录-myrmdir
bool myrmdir(string dir) {
if(rmdir(dir.c_str())==0) {
return true;
} else {
return false;
}
} //重命名文件或目录-myrename
bool myrename(string lastname,string newname) {
if(rename(lastname.c_str(),newname.c_str())==0) {
return true;
} else {
return false;
}
} //复制文件-mycopy
//先判断文件是否存在,存在则在原来要复制的文件名后加(1),否则直接复制
bool mycopy(string existname,string newname) {
int fo1,fo2;
char buf[1024];
fo1=open(existname.c_str(),O_RDONLY);
if(fo1==-1) {
return false;
} else {
fo2=open(newname.c_str(),O_RDONLY);
if(fo2!=-1) {
int i;
cout<<"确定替换文件?"<<endl;
cout<<"输入1为确定,非1为否定.";
cin>>i;
if(i!=1) {
newname+="(1)";
}
close(fo2);
}
fo2=open(newname.c_str(),O_WRONLY|O_CREAT,S_IRWXU);
int size = read(fo1,buf,sizeof(buf));
write(fo2,buf,size);
close(fo1);
close(fo2);
return true;
}
} //创建文件功能-- mycreat(open打开文件)
void creatopen()
{
cout<<"请输入要打开/创建的文件名: "<<endl;
cin>>filename;
C_fd = open(filename, O_RDWR|O_TRUNC, 0666);
if (C_fd >= 0) {
isopen = 1, cout<<"该文件已存在,打开成功"<<endl;
pargv[2] = (char *)malloc(50);
strcpy(pargv[2], filename);
}
else
{
C_fd = open(filename, O_CREAT|O_RDWR|O_TRUNC,0666);
if (C_fd >= 0)
isopen = 1, cout<<"该文件不存在,新建成功:"<<endl;
else
isopen = 0, cout<<"打开/新建失败"<<endl;
}
}
//创建文件功能-- mycreat(write写入文件内容)
void creatwrite()
{
char buffer[1024]; cout<<"请输入文件内容(按回车保存):"<<endl;
cin>>buffer; int t = write(C_fd, buffer, strlen(buffer));
if (t == -1)
cout<<"保存失败!"<<endl;
else
cout<<"保存成功!"<<endl;
cout<<"该文件内容为:";
cout<<buffer<<endl;
} //删除文件-mydelete
bool mydelete(string dir) {
if(unlink(dir.c_str())==0) {
return true;
} else {
return false;
}
} //菜单
void menu() {
system("clear");
cout<<"*********************************************"<<endl;
cout<<"* 基本命令"<<endl;
cout<<"* 1.tanghan@pwd:显示当前所在目录的路径名"<<endl;
cout<<"* 2.tanghan@list <目录名>:列出指定目录名中的所有目录及文件"<<endl;
cout<<"* 3.tanghan@modifydir <目录名或路径>:改变当前工作目录"<<endl;
cout<<"* 4.tanghan@makedir<目录名>:新建目录"<<endl;
cout<<"* 5.tanghan@deldir<目录名> :删除目录"<<endl;
cout<<"* 6.tanghan@exit:退出程序"<<endl; cout<<"* 拓展命令"<<endl;
cout<<"* 7.tanghan@rename <旧文件名> <新文件名>:重命名一个文件或目录"<<endl;
cout<<"* 8.tanghan@copy <已存在的文件名> <副本文件名或路径>:复制一个已存在的文件"<<endl;
cout<<"* 9.tanghan@date:显示当前日期"<<endl; cout<<"*********************************************"<<endl;
cout<<endl;
} int main() {
menu();
string s;
while(1) {
cout<<"请输入你的指令:";
cin>>s;
//显示当前所在目录的路径名
if(s=="tanghan@pwd"){
menu();
mypwd();
}
//列出指定目录名中的所有目录及文件
else if(s=="tanghan@list") {
menu();
cout<<"请输入指定一个目录:";
string dir;
cin>>dir;
if(!mylist(dir)) {
cout<<"目录打开失败或不存在!"<<endl;
}
}
//改变当前工作目录
else if(s=="tanghan@modifydir") {
menu();
cout<<"请输入指定一个目录:";
string path;
cin>>path;
if(!mycd(path)) {
cout<<"目录打开失败或不存在!"<<endl;
} else {
cout<<"当前工作目录为 "<<path<<endl;
}
}
//新建目录
else if(s=="tanghan@makedir") {
menu();
cout<<"请输入一个新的目录名:";
string dir;
cin>>dir;
if(!mymkdir(dir)) {
cout<<"创建目录失败!"<<endl;
} else {
cout<<"创建目录成功!"<<endl;
}
}
//删除目录
else if(s=="tanghan@deldir") {
menu();
cout<<"请输入一个存在的目录名:";
string dir;
cin>>dir;
if(!myrmdir(dir)) {
cout<<"目录不存在或删除失败!"<<endl;
} else {
cout<<"成功删除目录!"<<endl;
}
}
//退出程序
else if(s=="tanghan@exit") {
menu();
cout<<"再见!"<<endl;
return 0;
}
//重命名一个文件或目录
else if(s=="tanghan@rename") {
menu();
string lastname,newname;
cout<<"请输入需要修改的目录名或文件名:";
cin>>lastname;
cout<<"请输入新的目录名或文件名:";
cin>>newname;
if(!myrename(lastname,newname)) {
cout<<"重命名失败!"<<endl;
} else {
cout<<"重命名成功!"<<endl;
}
}
//显示当前日期
else if(s=="tanghan@date") {
menu();
date();
}
//创建/打开文件并写入
else if(s=="tanghan@creat") {
menu();
creatopen();
creatwrite();
}
//删除文件
else if(s=="tanghan@delete") {
menu();
cout<<"请输入一个存在的文件名:";
string dir;
cin>>dir;
if(!mydelete(dir)) {
cout<<"文件不存在或删除失败!"<<endl;
} else {
cout<<"成功删除文件!"<<endl;
}
}
//复制文件
else if(s=="tanghan@copy") {
menu();
string existname,newname;
cout<<"请输入需要复制的目录名或文件名:";
cin>>existname;
cout<<"请输入被复制的目录名或文件名:";
cin>>newname;
if(!mycopy(existname,newname)) {
cout<<"复制失败!"<<endl;
} else {
cout<<"复制成功!"<<endl;
}
}
//输入有误,重新输入
else {
menu();
cout<<"输入命令格式错误,请重新输入!"<<endl;
}
}
return 0;
}

 

操作系统大作业:在Linux环境下模拟实现简单命令解释器(代码部分)的更多相关文章

  1. git在windows及linux环境下安装及常用命令

    git在windows下安装 下载地址:https://git-scm.com/ 默认安装即可 验证 git --version git在linux下安装 下载地址:https://mirrors.e ...

  2. Linux 环境下的一些常用命令(三)

    转载自 http://www.oschina.net/translate/20-advanced-commands-for-middle-level-linux-users 21. 命令: Find ...

  3. Linux 环境下一些常用的命令(二)

    11. chown命令 "chown"命令就是改变文件拥有者和所在用户组.每个文件都属于一个用户组和一个用户.在你的目录下,使用"ls -l",你就会看到像这样 ...

  4. Linux环境下常用的SSH命令

    目录操作: rm -rf mydir /*删除mydir目录*/ mkdir dirname /*创建名为dirname的目录*/ cd mydir /*进入mydir目录*/ cd – /*回上一级 ...

  5. Linux 环境下 jar 加解密命令?

    1.源码打jar包 jar -cvf demo-source.jar -C src/ . > log.txt 2.编译字节打jar包 jar -cvf demo-class.jar -C bin ...

  6. Linux环境下实现对文件读写操作

    ---- 今天分享一下在linux系统在实现对文件读写一些基本的操作,在这之前我们要掌握一些基本的技能在Linux环境下.比如查看命令和一个函数的具体用法,就是相当于查手册,在Linux下有一个man ...

  7. PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)

    源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...

  8. 【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)

    原创 2016-09-12 熊军 [云和恩墨]性能优化:Linux环境下合理配置大内存页(HugePage)   熊军(老熊) 云和恩墨西区总经理 Oracle ACED,ACOUG核心会员 PC S ...

  9. 【转载】linux环境下大数据网站搬家

    这里说的大数据是指你的网站数据库大小至少超过了500M,当然只有50M的网站也同样可以用这样的方法来轻松安全的实现网站搬家,前提是你使用的是linux环境下的VPS或者独立服务器. 我们假设你的网站域 ...

  10. 【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结

    本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 1. 段错误是什么 ...

随机推荐

  1. 4.1 应用层Hook挂钩原理分析

    InlineHook 是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截.修改.增强现有函数功能.它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义 ...

  2. 使用 Sealos 一键部署高可用 MinIO,开启对象存储之旅

    大家好!今天这篇文章主要向大家介绍如何通过 Sealos 一键部署高可用 MinIO 集群. MinIO 对象存储是什么? 对象是二进制数据,例如图像.音频文件.电子表格甚至二进制可执行代码.对象的大 ...

  3. flutter的json转dart model问题

    原文链接 原文链接 Preface 最近在做一个app,以后续用来找工作可以拿出来看看. 试试自己到产品设计能力,前后端能力等等. 中间遇到到一些有值得记录的点全部记录在此. Content json ...

  4. 在线问诊 Python、FastAPI、Neo4j — 创建 节点关系

    目录 关系:症状-检查 关系:疾病-症状 代码重构 relationship_data.csv 症状,检查,疾病,药品,宜吃,忌吃 "上下楼梯疼,不能久站,感觉有点肿"," ...

  5. pta2023年9月7日 第五期

    5月23日   11月14日   有效期3年: 更新方式待定:  双方认证合作CCF编程培训师资认证(PTA)中国计算机学会https://pta.ccf.org.cn/中国科教工作者协会(原:中国青 ...

  6. Go接口 - 构建可扩展Go应用

    本文深入探讨了Go语言中接口的概念和实际应用场景.从基础知识如接口的定义和实现,到更复杂的实战应用如解耦与抽象.多态.错误处理.插件架构以及资源管理,文章通过丰富的代码示例和详细的解释,展示了Go接口 ...

  7. es6(1)

    1.var let const var---变量,重复定义不报错,没有块级作用域,不能限制修改 if(12>5){ var a=12; } alert(a); //弹出12 let---变量,重 ...

  8. 初识FreeRTOS

    FreeRTOS是一个迷你的实时操作系统内核.作为一个轻量级的操作系统,功能包括:任务管理.时间管理.信号量.消息队列.内存管理.记录功能.软件定时器.协程等,可基本满足较小系统的需要.   一.Fr ...

  9. SQL Server事务及隔离级别

    事务的并发操作可能出现的问题 中文 英文 描述 脏读 Dirty Reads 事务2读到了事务1未提交的事务,事务1随后回滚,但事务2读到了事务1的"中间数据". 在Read Un ...

  10. 从零开始学习web前端技术路线图

    最近我侄子快实习了,学校跟培训机构合作,交两万多可以参与一个培训,培训四个月,可以包就业.侄子问我,是否要去培训,培训出来可以找到工作吗? 现在很多大学生,上学的时候谈恋爱,玩游戏,快要毕业就焦虑了. ...