文档详情

《系统软件课程设计-操作系统》实验报告.doc

发布:2017-02-07约5.94千字共10页下载文档
文本预览下载声明
《系统软件课程设计》 实验报告 华东理工大学信息科学与工程学院 一.课程设计题目 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
显示全部
相似文档