操作系统课程设计报告         
日期:2023年4月17日
实习题目:shell程序
完成人
实习内容简要描述
本实验要求用C语言编写一个简单的命令解释器,即 Linux 中的 shell 程序。实验程序需起名为 ysh,设计类似于目前流行的 shell 解释程序,如 bashcshtcsh,但不需要具备那么复杂的功能。ysh 程序应当具有如下一些重要的特征:
1.能够执行外部程序命令,命令可以带参数。
2.能够执行 fgbgcdhistoryexit 等内部命令。
3.使用管道和输入输出重定向。
4.支持前后台作业,提供作业控制功能,包括打印作业的清单,改变当前运行作业的前台/后台状态,以及控制作业的挂起、中止和继续运行。
5.使用 make 工具建立工程。
6.使用调试器 gdb 来调试程序。
7.提供清晰、详细的设计文档和解决方案。
主要代码结构
(附注释)
一、头文件
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<signal.h>
二、宏定义及全局变量
//命令的最大条数
#define MAXCMD 20
//命令最大字符数
#define BUFFSIZE 250
//每条命令最大长度
#define MAXCMDLEN 100
/* 全局变量 */
//命令行的参数个数
int argc;
//参数指针数组
char* argv[MAXCMD];
//参数二维数组
char command[MAXCMD][MAXCMDLEN];
//接受键盘输入的参数数组
char buff[BUFFSIZE];
//记录已经输入的指令数目
int commandCount; 
//记录历史命令     
char history[MAXCMD][BUFFSIZE];   
三、函数声明
//接受键盘输入函数
int input(char buff[]);
//分析指令
void analysis(char* buff);
//执行指令
void work(int argc, char* argv[]);
//显示历史指令函数
int historyShow(char command[MAXCMD][MAXCMDLEN]);
int cd(int argc);
四、主函数实现
int main()
{
    //无限循环
    while(1)
    {
        //打印命令提示符
        printf("ysh>");
       
        //接受来自键盘的输入
        //如果输入字符为0, 则跳过开始下一次循环
        if (input(buff)==0) continue;
        //存入命令历史数组
        strcpy(history[commandCount++], buff);
        //分析命令,构建相应数组
        analysis(buff);
        //执行指令
        work(argc, argv);
        //重新清0
        argc = 0;
    }
    return 0;
}
结果分析(或错误原因分析)
1.该实验结果具有基本的shell程序框架。
2.该程序能成功执行cd、ls、pwd、vi、history、exit等命令和基本的linux命令。
3.该程序同时能对不合法输入(如:指令不合法、路径不存在等)进行识别和给出报错提示。
4.该程序能实现特殊键即组合键,Ctrl+Z和Ctrl+C。能实现程序ysh对这些信号做出适当响应。
5.实验未能正确实现fg、bg、jobs命令,同时在重定向以及管道命令方面也没能完全实现。
教师评语
实验程序简图:
附代码:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
linux命令及shell编写#include<fcntl.h>
#include<signal.h>
//命令的最大条数
#define MAXCMD 20
//命令最大字符数
#define BUFFSIZE 250
//每条命令最大长度
#define MAXCMDLEN 100
/* 全局变量 */
//命令行的参数个数
int argc;
//参数指针数组
char* argv[MAXCMD];
//参数二维数组
char command[MAXCMD][MAXCMDLEN];
//接受键盘输入的参数数组
char buff[BUFFSIZE];
//记录已经输入的指令数目
int commandCount; 
//记录历史命令     
char history[MAXCMD][BUFFSIZE];       
/* 函数声明 */
//接受键盘输入函数
int input(char buff[]);
//分析指令
void analysis(char* buff);
//执行指令
void work(int argc, char* argv[]);
//显示历史指令函数
int historyShow(char command[MAXCMD][MAXCMDLEN]);
int cd(int argc);
/* 函数实现 */
//接受键盘输入函数
int input(char buff[])
{
    //数组初始化
    memset(buff, 0x00, BUFFSIZE); 
    fgets(buff, BUFFSIZE, stdin);
    //去除fgets带来的末尾\n字符

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。