您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 实验五-编程实现自己的shell操作系统实验报告
学年第学期操作系统课程实验报告学院:专业:班级:姓名:学号:任课教师:-2-摘要shell是一个命令处理器(commandprocessor)——是一个读入并解释你输入的命令的程序,它是介于使用者和操作系统之核心程序(kernel)间的一个接口。它是一个交互性命令解释器。shell独立于操作系统,这种设计让用户可以灵活选择适合自己的shell。shell让你在命令行键入命令,经过shell解释后传送给操作系统(内核)执行。Shell是一个管理进程和运行进程的程序。有三个主要功能。(1)运行程序:shell是一个程序启动器。(2)管理输入和输出:shell将进程的输入和输出连接到一个文件或其他的进程。(3)编程关键字:shell;解释器;程序;-3-实验日期:2017年6月12日实验题目实验五编程实现自己的shell实验地点实验目的了解shell的功能和其执行程序的过程,编写自己的shell程序实验内容1.编辑程序psh1.c,编译并执行。#includestdio.h#includesignal.h#includestring.h#definemaxargs20#definearglen100intmain(){char*arglist[maxargs+1];intnumargs;charargbuf[arglen];char*makestring();numargs=0;while(numargsmaxargs){printf(Arg[%d]?,numargs);if(fgets(argbuf,arglen,stdin)&&*argbuf!='\n')arglist[numargs++]=makestring(argbuf);else{if(numargs0){arglist[numargs]=0;execute(arglist);numargs=0;}}}return0;}intexecute(char*arglist[]){execvp(arglist[0],arglist);perror(execvpfailed);exit(1);}-4-char*makestring(char*buf){char*cp,*malloc();buf[strlen(buf)-1]='\0';cp=malloc(strlen(buf)+1);if(cp==0){fprintf(stderr,nomemory\n);exit(1);}strcpy(cp,buf);returncp;}2.编辑程序psh2.c,编译并执行。#includestdio.h#includesignal.h#includestring.h#definemaxargs20#definearglen100intmain(){char*arglist[maxargs+1];intnumargs;charargbuf[arglen];char*makestring();numargs=0;while(numargsmaxargs){printf(Arg[%d]?,numargs);if(fgets(argbuf,arglen,stdin)&&*argbuf!='\n')arglist[numargs++]=makestring(argbuf);else{if(numargs0){arglist[numargs]=0;execute(arglist);numargs=0;}}}return0;}intexecute(char*arglist[]){intpid,exitstatus;pid=fork();switch(pid){case-1:perror(forkfailed);exit(1);case0:execvp(arglist[0],arglist);perror(excvpfailed);-5-exit(1);default:while(wait(&exitstatus)!=pid);printf(childexitedwithstatus%d,%d\n,exitstatus8,exitstatus&0377);}}char*makestring(char*buf){char*cp,*malloc();buf[strlen(buf)-1]='\0';cp=malloc(strlen(buf)+1);if(cp==0){fprintf(stderr,nomemory\n);exit(1);}strcpy(cp,buf);returncp;}3.测试运行结果(1)分别执行psh1和psh2,执行过程中,输入ps命令写出两个程序运行的结果。并分析区别和原因。(2)在执行psh2过程中,输入./psh1和ps命令写程序运行的结果。实验结果(1)-6-分析:在psh1.c中,构造函数intexecute(){execvp(arglist[0],arglist);;exit(1);}只执行一次,所以在输入ps后直接自动退出;在psh2.c中,构造函数intexecute(char*arglist[]){switch(){case-1:;exit(1);case0:execvp(arglist[0],arglist);exit(1);Default:}}运用switch函数,所以在输入ps后仍继续执行。(2)-7-遇到问题及解决方法1.编译后出现较多warning警告,如图下:虽编译时出现警告,但是并不影响程序的运行,进而继续执行。总结经过本次实验的学习,知道了可以通过PS命令查看用户空间的进程,可以设置参数:-a:列出所在进程,包括其他终端由其他用户运行的程序。-l:更出各个进程的详细状态。也知道了shell运行程序的过程:(1)用户键入程序名a.out(2)Shell建立一个新的进程来运行这个程序;(3)Shell将程序从磁盘载入(4)程序在它的进程中运行直到结束。在编程过程中要多了解库函数,可以阅读相应的帮助文件来获得有用的信息。shell语言与其他编程语言相比真正有说服力。Shell提供把进程和文件连接在一起的强力的记法。在这个角度上,shell语言非常适合作为Unix操作系统的一般性范例。在Unix中,基本的计算代理(agent)是程序,它作为在单独的地址空间中的进程而运行。通过在叫做管道的有向字节流上通信,这些代理协同并相互交流来解决问题。在这个层次上看,Unix是一个数据流体系。在这个角度上,shell担任了关键角色,这门语言设计用来把单独的计算代理结合起来解决一个特定问题。在这次实践过程中,我发现自己对shell还是缺乏很多的了解,所以还需继续加深学习。
本文标题:实验五-编程实现自己的shell操作系统实验报告
链接地址:https://www.777doc.com/doc-4995702 .html