系统调用及进程控制综合设计实验 设计简单的命令行 shell

一、实验目的

  1. 熟悉Linux下进程控制相关的系统调用,并熟练使用相关函数完成进程控制的操作
  2. 设计简单的命令行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. 要求具有良好的代码风格,主要的函数和变量均有注释。

要求格式和编写文档如下:
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下进程控制相关的系统调用,以及使用相关函数完成进程控制的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jadenmong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值