操作系统课程设计报告
日期:2023年4月17日
实习题目:shell程序 | |||
完成人 | |||
实习内容简要描述 | 本实验要求用C语言编写一个简单的命令解释器,即 Linux 中的 shell 程序。实验程序需起名为 ysh,设计类似于目前流行的 shell 解释程序,如 bash、csh、tcsh,但不需要具备那么复杂的功能。ysh 程序应当具有如下一些重要的特征: 1.能够执行外部程序命令,命令可以带参数。 2.能够执行 fg、bg、cd、history、exit 等内部命令。 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小时内删除。
发表评论