操作系统课程设计---实验十 简单shell命令行解释器的设计与实现
实验十 简单shell命令行解释器的设计与实现1、实验目的本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用,了解 shell 工作的基本原理,自己动手为 Linux 操作系统设计一个简单的命令接口。2、背景知识本实验要使用创建子进程的 fork()函数,执行新的命令的 exec()系列函数,通常 shell 是等待子进程结束后再接受用户新的输入,这可以使用 waitpi
实验十 简单shell命令行解释器的设计与实现
完整课程设计源码及其报告查看:陈陈的操作系统课程设计
1、实验目的
本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用,了解 shell 工作
的基本原理,自己动手为 Linux 操作系统设计一个简单的命令接口。
2、背景知识
本实验要使用创建子进程的 fork()函数,执行新的命令的 exec()系列函数,通常 shell 是等待子
进程结束后再接受用户新的输入,这可以使用 waitpid()函数。以上相关的系统函数调用的说明请参
见实验二的背景知识。
3、设计内容与要求
要设计的 shell 类似于 sh,bash,csh 等,必须支持以下内部命令:
cd <目录>更改当前的工作目录到另一个<目录>。如果<目录>未指定,输出当前工作目录。如果<目录>不存在,应当有适当的错误信息提示。这个命令应该也能改变 PWD 的环境变量。
environ 列出所有环境变量字符串的设置(类似于 Linux 系统下的 env 命令)。
echo <内容> 显示 echo 后的内容且换行
help 简短概要的输出你的 shell 的使用方法和基本功能。
jobs 输出 shell 当前的一系列子进程,必须提供子进程的命名和 PID 号。
quit,exit,bye 退出 shell。
提示:shell 的主体就是反复下面的循环过程
while(1){
接收用户输入的命令行;
解析命令行;
if(用户命令为内部命令)
直接处理;
else if(用户命令为外部命令)
创建子进程执行命令;
else
提示错误的命令;
}
实验源码:下面源码直接做成.c文件直接在虚拟机上运行即可
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
char cmd[2100];
while(1)
{
printf("\n --------------------------------------------------\n");
printf(" shell 命令行解释器");
printf("\n --------------------------------------------------\n\n");
printf("\n -----------------------------------\n");
printf(" 操作选择 \n");
printf(" -----------------------------------\n");
printf("|1、echo |\n");
printf("|2、quit exit bye |\n");
printf("|3、cd |\n");
printf("|4、jobs |\n");
printf("|5. environ |\n");
printf("|6. help |\n");
printf(" -----------------------------------\n");
printf("\n");
printf("请输入你的操作:");
scanf("%s",cmd);
int len=strlen(cmd),i;
if(cmd[0] == 'e' && cmd[1] == 'c') // echo
{
int flag=0;
for( i=5; i<len-1; i++)
{
if(cmd[i]!=' ') flag=1;
if(flag)
{
putchar(cmd[i]);
}
}
if(flag) putchar('\n');
}
else if(cmd[0]=='q' || cmd[1]=='x' || cmd[0]=='b') // quit,exit,bye
{
printf("Bye\n");
return 0;
}
else if(cmd[0]=='h') // help
{
printf("/**********************************/\n");
printf("echo <content>\tprint a line content\n");
printf("quit,exit,bye\tend produce\n");
printf("cd <catalog>\techo catalog\n");
printf("jobs\techo process name and pid...\n");
printf("environ\techo environment variable\n");
printf("/**********************************/\n");
}
else
{
char cata[100];
int cnt=0;
if(cmd[0]=='c') // cd
{
int flag=0;
for( i=3; i<len; i++)
{
if(cmd[i]!=' ') flag=1;
if(flag)
{
cata[cnt++] = cmd[i];
}
}
if(cnt==0)
{
cata[0]='.';
cata[1]='\0';
}
}
/* fork a child process */
pid_t pid = fork();
if (pid < 0)
{
/* error occurred */
fprintf(stderr, "Fork Failed");
return 1;
}
else if(pid==0)
{
if(cmd[0]=='c') // cd
{
execlp("/bin/ls",cata,NULL);
}
else if(cmd[0]=='j') // jobs
{
execlp("pstree","-p",NULL);
}
else if(cmd[0]=='e') // environ
{
execlp("env","",NULL);
}
}
else
{
/* wait wait,until child process exit*/
wait();
}
}
printf("\n");
}
return 0;
}
实验结果截图及其分析:
更多课程设计源码请进主页查看搜索:陈陈不会敲代码
完整课程设计报告请下载:陈陈的操作系统课程设计源码及其报告
完整报告包含以下内容的源码以及实验报告:
资源展示如下:
更多推荐
所有评论(0)