一、实验目的
- 熟悉Linux下进程控制相关的系统调用,并熟练使用相关函数完成进程控制的操作
- 设计简单的命令行myshell
二、实验要求
设计简单的命令行myshell,并能在实验环境下运行。
要求支持的命令如下:
1.cd [directory] 将当前目录改为 [directory]
2.environ 列出所有环境变量
3.ls 列出指定目录下所有文件
4.help 显示所有支持的命令
5.echo 在屏幕上显示参数并换行
6.quit 退出 shell
7.支持I/O重定向
8.常见的目录和文件操作,比如新建目录或文件,目录或文件的删除、复制,显示文件内容等。
上述基础功能满分70分,完成下面各功能并在文档中说明可得到加分,每项功能最多加10分:
1.支持管道符操作
2.不限制命令参数个数
3.实现彩色输出
4.支持其它一些常见的linux命令
5.自己认为比较重要或能体现自己水平的功能
说明:
- 可以使用在实验指导中的程序框架,也可以自己编写;
- 要求具有良好的代码风格,主要的函数和变量均有注释。
要求格式和编写文档如下:
1.按照指定的格式;
2.对如何使用自己的shell 编写一个简单的手册或文档;
3.对自己程序的运行过程进行说明并对结果截图;
4.对自己的设计和实现思路做出说明,指出自己的实现有何优点或不足,有何改进的办法。
5.对本次设计进行总结。
三、提交要求
本次实验为综合设计性实验,须按指定的要求和格式完成,并作为期末成绩的判定依据;
四、实验结果
1、部分源代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <pwd.h>
//颜色宏定义
#define NONE "\e[0m"
#define L_RED "\e[1;31m"
#define L_GREEN "\e[1;32m"
#define BLUE "\e[0;34m"
#define WHITE "\e[1;37m"
#define L_PURPLE "\e[1;35m"
//分析命令种类
#define NORMAL 0 // 一般的命令
#define OUT_REDIRECT 1 // 带输出重定向命令
#define IN_REDIRECT 2 // 带输入重定向命令
#define PIPE 3 // 带管道命令
// 保存当前的命令行输入
#define BUFFSIZE 256
char line[BUFFSIZE];
//存储当前路劲
char buffer[BUFFSIZE];
//存储用户名,主机名
char hostname[BUFFSIZE] = { '\0' };
// 根据命令行输入得到的命令参数
char args[10][80];
// 计数,命令中词汇数量
int argcount = 0;
// 打印提示符
void Print_prompt();
// 读取用户输入的命令
void Get_input(char *);
// 解析输入的命令
void Explain_command(char *, int *, char (*a)[80]);
//执行命令
void Do_cmd(int, char a[][80]);
// 查找命令中的可执行程序
int Find_command(char *);
// 执行 cd 命令
void exec_cd();
//执行help
void exec_help();
int main(int argc, char *argv[])
{
while(1)
{
memset(line, 0, BUFFSIZE); //清空数组
Print_prompt(); // 打印提示符
Get_input(line); // 读取用户输入
if(strcmp(line, "exit")==0 || strcmp(line, "quit")==0)
break;
if(strcmp(line, "help")==0)
{
exec_help();
continue;
}
int i = 0;
args[i][0] = '\0';
argcount = 0;// 计数,命令中词汇数量
Explain_command(line, &argcount, args); // 解析命令
if(strncmp(line, "cd",2)==0)
{
exec_cd();
continue;
}
Do_cmd(argcount, args);// 执行命令
}
return 0;
}
完整源码请见:https://download.csdn.net/download/weixin_43372169/60738417
2、使用说明
编译运行源代码->输入shell命令->回车执行命令
3、完成要求功能
4、完成加分功能
1、支持管道符操作
2、支持其它一些常见的linux命令
3、支持其它一些常见的linux命令
查找指定ssh服务进程、查找指定进程个数
5、设计和实现思路
6、总结
本次实验我完成了八项要求功能,分别是1.cd [directory] 将当前目录改为 [directory]、2.environ 列出所有环境变量、3.ls 列出指定目录下所有文件、4.help 显示所有支持的命令、5.echo 在屏幕上显示参数并换行、6.quit 退出 shell、7.支持I/O重定向、8.常见的目录和文件操作,比如新建目录或文件,目录或文件的删除、复制,显示文件内容等。并且完成了三项加分功能,分别是1.支持管道符操作、2.对文件进行打包tar功能、3.查找指定ssh服务进程、查找指定进程个数。
通过本次实验我更加熟悉Linux下进程控制相关的系统调用,以及使用相关函数完成进程控制的操作。