期末 操作系统实验课程设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验课程设计(二)(参照实验五)

学院:计算机科学与工程专业:信息管理工作与信息系统学号:2008142118 姓名:丁建东

一、实验题目:设计一个Shell解释器

二、实验目的:本设计的主要目的在于学会如何在Unix系

统下创建进程和管理进程。

三、实验内容:

实现一个简单的shell(命令行解释器),类似于bash, csh等。

要求实现的shell支持以下内部命令:

1.cd <目录>

更改当前的工作目录到另一个<目录>。如果<目录>未指定,输出当前工作目录。如果<目录>不存在,要求有适当的错误信息提示。改命令应能够改变PWD的环境变量。

2.echo <内容>

显示echo后的内容且换行。

3.help

简短概要地输出你的shell的使用方法和基本功能。

4.jobs

输出shell当前的一系列子进程,要求提供子进程的命名和PID号。

5.quit, exit, bye

退出shell。

所有的内部命令应当优于在$PATH中同名的程序。

任何非内部命令必须请求shell创建一个新进程,且该子进程执行指定的程序。这个新进程必须继承shell的环境变量和指定的命令行参数。

要求实现的shell支持以下内部命令:

Batch Processing 如果shell启动带有一个文件名作为参数,打开该文件并执行文件里所有命令。待所有进程全部结束退出shell。

四、实验思路:

1.所用到的系统函数

(1)打开目录

void cd()

API调用:int chdir(dir);getcwd(dir,dir_max);

实现:改变当前目录,并判断目录是否存在。

(2)回应

void echo()

实现:

用户输入字符串,以回车结束输入。

char echo_string[echo_len][echo_max];//用户输入命令,以空格符隔开,存为字符串数组

按顺序输出用户输入的字符串。

(3)输出当前子进程

Void jobs()

API调用:shmget(),shmat()

实现:开辟一个共享内存区,一旦创建一个子进程,就把该进程的进程ID和名字记字共享区里,在子进程结束的时候消除该记录。这样,调用jobs时只要读取共享区里的记录并输出就可以知道当前运行的子进程了。

(4)输出当前路径

void pwd()

API调用:getcwd();

五、程序流程图

。。。

六、程序代码

#include

#include

#include

#include

#include

#include

#include

#include

#define MAXLENGTH 25

#define SUBLENGTH 5

#define LINELENGTH 40

#define ECHO "myshell#"

#define QUIT "exit"

char * readline;

typedef enum

{

EXEC,REDI,REDIS,PIPE,NOHUP,BACKGROUND }TokenType;

typedef void (*fun)(char *);

void analyse(void);

void exec(char*);

void redi(char*);

void piped(char*);

void bgtask(char*);

sigset_t *set;

int main(void)

{

readline = (char *) malloc(MAXLENGTH*sizeof(char)); set = (sigset_t *)malloc(sizeof(sigset_t));

sigemptyset(set);

if( sigaddset(set,SIGINT) == -1)

{

printf("sigset error1~!\n");

exit(0);

}

if(sigprocmask(SIG_BLOCK,set,NULL) == -1)

{

printf("sigset error2~!\n");

exit(0);

}

while(1)

{

//signal(SIGINT,SIG_IGN); //ctrl+c is ignored

fputs(ECHO,stdout);//printf echo

gets(readline);//gets readline

if(strncmp(readline,QUIT,4) == 0) //equal exit then exit {

free(readline);

return 0;

}

analyse();//analyse

}

}

//analyse the readline

void analyse(void)

{

TokenType type = EXEC; //command style int i = 0;

char c ;

//function mapping

fun fun_array[] ={

exec,

redi,

NULL,

piped,

NULL,

bgtask

};

//the 'nohup ' is amazing

相关文档
最新文档