《系统软件课程设计-操作系统》实验报告.doc
文本预览下载声明
《系统软件课程设计》
实验报告
华东理工大学信息科学与工程学院
一.课程设计题目
Shell编程
二.课程设计成员
胡伟强 计121 三.课程设计内容和要求
学习如何编写一个Linux的外壳——Shell,即命令解释程序。学习怎样接受命令、解释命令、执行命令,特别是采用创建子进程的方式来执行一个程序,以及父进程如何继续子进程的工作。?
要求:
1、编写一个C语言程序作为Linux内核的shell命令行解释程序,所执行的结果需和系统命令行方式保持一致。
2、对用户编写的shell增加后台运行功能。即用户可以使用””作为一个命令结束,以启动下一个命令。
3、修改程序,增加I/O重定向功能。即用户可以使用””、””和”|”符号改变程序/文件的输入和输出。
四. 软件系统设计
1、函数调用图:
函数功能说明:
函数名 功能说明 void execute(void) 执行函数,程序的主体 Void child_process_handler(int sig) 处理后台运行进程函数,用于清除后台运行的子进程,以防其变成僵尸进程 void terminal_prompt(char*) 终端提示符函数 int read_command(char **,char **,char*) 读取命令函数,从用户输入中读取命令和参数,分别放入command[]和parameters[][]中,作为exec族函数执行。 int parsing(char **,int,struct parse_info *) 语法分析函数,主要处理后台执行,重定向,管道功能实现 int parse_info_init(struct parse_info *info) 初始化结构体struct parse_info *info int builtin_command(char *command, char **parameters) 内建命令函数,实现了exit、cd、help命令
算法设计
程序框架
#define TRUE 1
while(TRUE) {
type_prompt(); read_command(command,parameters);
if(fork()!=0) {
/* Parent code */
waitpid(-1,status,0);
} else {
/* Child code */
execve(command,parameters,0);
}
}
2.程序主体功能execute()函数的实现
#include myshell.h
void execute(void)
{
int status,i;
char *command = NULL;//命令
char **parameters;//参数
int ParaNum;//参数个数
char prompt[MAX_PROMPT];//提示
struct parse_info info;
pid_t ChdPid,ChdPid2;
parameters = malloc(sizeof(char *)*(MAXARG+2));
buffer = malloc(sizeof(char) * MAXLINE);
if(parameters == NULL || buffer == NULL)//内存分配失败
{
printf(mysh error:malloc failed.\n);
return;
}
if(signal(SIGCHLD,child_process_handler) == SIG_ERR)//父进程调用将SIGCHLD绑定到sig_handler()函数,这样fork出来的子进程在终止时会自动清理掉
perror(signal() error);
while(TRUE)
{
int pipe_fd[2],in_fd,out_fd;
terminal_prompt(prompt);//终端提示符函数
ParaNum = read_command(command,parameters,prompt);//读入命令
if(-1 == ParaNum)
c
显示全部