操作系统大作业:在Linux环境下模拟实现简单命令解释器(代码部分)
好家伙
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环境下模拟实现简单命令解释器(代码部分)的更多相关文章
- git在windows及linux环境下安装及常用命令
git在windows下安装 下载地址:https://git-scm.com/ 默认安装即可 验证 git --version git在linux下安装 下载地址:https://mirrors.e ...
- Linux 环境下的一些常用命令(三)
转载自 http://www.oschina.net/translate/20-advanced-commands-for-middle-level-linux-users 21. 命令: Find ...
- Linux 环境下一些常用的命令(二)
11. chown命令 "chown"命令就是改变文件拥有者和所在用户组.每个文件都属于一个用户组和一个用户.在你的目录下,使用"ls -l",你就会看到像这样 ...
- Linux环境下常用的SSH命令
目录操作: rm -rf mydir /*删除mydir目录*/ mkdir dirname /*创建名为dirname的目录*/ cd mydir /*进入mydir目录*/ cd – /*回上一级 ...
- Linux 环境下 jar 加解密命令?
1.源码打jar包 jar -cvf demo-source.jar -C src/ . > log.txt 2.编译字节打jar包 jar -cvf demo-class.jar -C bin ...
- Linux环境下实现对文件读写操作
---- 今天分享一下在linux系统在实现对文件读写一些基本的操作,在这之前我们要掌握一些基本的技能在Linux环境下.比如查看命令和一个函数的具体用法,就是相当于查手册,在Linux下有一个man ...
- PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)
源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...
- 【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)
原创 2016-09-12 熊军 [云和恩墨]性能优化:Linux环境下合理配置大内存页(HugePage) 熊军(老熊) 云和恩墨西区总经理 Oracle ACED,ACOUG核心会员 PC S ...
- 【转载】linux环境下大数据网站搬家
这里说的大数据是指你的网站数据库大小至少超过了500M,当然只有50M的网站也同样可以用这样的方法来轻松安全的实现网站搬家,前提是你使用的是linux环境下的VPS或者独立服务器. 我们假设你的网站域 ...
- 【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结
本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 1. 段错误是什么 ...
随机推荐
- mpi转以太网连接300PLC实现以太网通信配置方法
西门子S7300PLC连接MPI-ETH-XD1.0实现以太网通信配置方法 产品简介 兴达易控MPI-ETH-XD1.0用于西门子S7-200/SMART S7-200/S7-300/S7-400/西 ...
- MySQL快速导入千万条数据(3)
目录 一.测试环境 二.命令行导入方式 三.LOAD DATA导入方式 四.结论 接上文,本次在较高性能的X86物理机上,做真实生产环境的大数据量导入测试. 一.测试环境 ■ CPU是24核,每核2线 ...
- C#学习笔记--面向对象三大特征
C#核心 面向对象--封装 用程序来抽象现实世界,(万物皆对象)来编程实现功能. 三大特性:封装.继承.多态. 类与对象 声明位置:namespace中 样式:class 类名{} 命名:帕斯卡命名法 ...
- IEEE754浮点数与字节数互转工具
前段时间做的一个小工具,分享一下. 提供浮点数和字节的相互转换. 下载
- Prometheus+Grafana实现服务性能监控:windows主机监控、Spring Boot监控、Spring Cloud Alibaba Seata监控
1.Prometheus介绍 Prometheus使用Go语言开发,中文名称叫:普罗 米修斯.Prometheus是一个开源系统最初在SoundCloud构建的监控和警报工具包.自 2012 年成立以 ...
- 如何深度学习Python?
安装必要软件:首先需要安装Anaconda或Miniconda等科研计算环境,并创建虚拟环境以便管理不同项目所需库和版本.可以按照如下步骤进行操作: 下载并安装 Anaconda 或 Minicond ...
- 算法训练 递归 s01串
问题描述 s01串初始为"0" 按以下方式变换 0变1,1变01 输入格式 1个整数(0~19) 输出格式 n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定 0~ ...
- iptables中limit 和 limit-burst 说明
Limit match 这个匹配操作必须由-m limit明确指定才能使用.有了他的帮助,就能对指定的规则的日志数量加以限制,以免你被信息的洪流淹没哦.比如,你能事先设定一个限定值,当符合条件的 ...
- 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...
- Codeforces Round 894 (Div. 3)
Codeforces Round 894 (Div. 3) A. Gift Carpet 题意:判断一列一个字母有没有"vika" 思路:挨个枚举每一列 #include<b ...