操作系统实验报告shell程序_第1页
操作系统实验报告shell程序_第2页
操作系统实验报告shell程序_第3页
操作系统实验报告shell程序_第4页
操作系统实验报告shell程序_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持操作系统实习报告日期:实习题目:shell程序完成人姓名:组号:学号实习内容简要 描述本实验要实现一个简单的命令解释器,也就是Linux中的shell程序。实验程序起名为ysh,要求其设计类似于目前流行的shell解释程序,如bash csh、tcsh,但不需要具备那么复杂的功能。ysh程序应当具有如下一些重要的特征:能够执行外部程序命令,命令可以带参数。能够执行fg、bg、cd、history、exit等内部命令。使用管道和输入输岀重定向。支持前后台作业,提供作业控制功能,包括打印作业的清单,改变当前运行作业的前台/后台状态,以及控

2、制作业的挂起、中止和继续运行。除此之外,在这个实验中还须做到:使用make工具建立工程。使用调试器gdb来调试程序。提供清晰、详细的设计文档和解决方案。主要代码结构(附注释)#include #include #include #include #include #include #include #include #include #include #include #include ysh.h#define NO_PIPE -1#define FD_READ 0#define FD_WRITE 1int is_founded(char * cmd)int k = 0;while(envpa

3、thk != NULL)strcpy(buf,envpathk);strcat(buf,cmd);if(access(buf,F_OK) = 0)return 1;k+;return 0;void getenviron(int n,char * s) int i = 0,j = 0,k = 0;char c;char buff80;char * p;while(c=si) != =) buffi+ = c; buffi+ = 0;if(strcmp(buff,PA TH) = 0) while(si != 0)if(si = :) buffj+ = /;buffj = 0;p = (char

4、*)malloc(strlen(buff) + 1); strcpy(p,buff);envpathk+ = p;envpathk = NULL;j = 0;i+; else buffj = si;j+;i+; elsefprintf(stderr,No match);int getline(int fd,char * buf) int i = 0;char c;while(read(fd,& c,1) bufi+ = c;if(c = n) bufi-1 = 0; return i; return i;void init_environ()int fd,n;char buf80;if(fd

5、= open(ysh_profile,O_RDONLY ,660) = -1) printf(init environ variable error!n);exit(1);while(n = getline(fd,buf) != 0) getenviron(n,buf);envhis.start = 0;envhis.end = 0;head = end = NULL;int pipel(char * input,int len) char * argv1030;char * filename0;int i,j,k,is_bg = 0;int li_cmd = 0;int fd101,pipe

6、_in = -1;int pipe_out = -1,flag = 0;pid_t pid;for(i = 0,j = 0,k = 0;i ) | (inputi = n) if(inpu ti = T) | (inpu ti = )if(inpu ti = ) flag =1;if(j 0 )bufj+ = 0;argvli_cmdk = (char *)malloc(sizeof(char) * j); strcpy(argvli_cmdk,buf);k+;argvli_cmdk = (char *)0;li_cmd+;k = 0;j = 0;if(j = 0)continue; else

7、bufj+ = 0;if(flag = 0)argvli_cmdk = (char *)malloc(sizeof(char) * j); strcpy(argvli_cmdk,buf);k+; elsefilename0 = (char *)malloc(sizeof(char) * j); strcpy(filename0,buf);j = 0;else if(inputi = &)& (inputi = 0) is_bg = 1;continue;bufj+ = inpu ti;argvli_cmdk+ = NULL;for(i = 0;i = 10;i+) fdiFD_READ = N

8、O_PIPE; fdiFD_WRITE = NO_PIPE;for(i = 0;i li_cmd;i+) if(pipe(fdi) = -1)printf(Can not open pipe!n);return 0;for(i = 0;i li_cmd;i+)if(is_founded(argvi0) = 0)printf(Can not found command!n);break;if(i != 0)pipe_in = fdi - 1FD_READ; elsepipe_in = NO_PIPE;if(i != li_cmd)pipe_out = fdiFD_WRITE;elseif(fla

9、g = 1)if(pipe_out = open(filename0,O_WRONLY | O_CREA T | O_TRUNC,S_IRUSR | S_IWUSR) = -1)printf(Can not open %sn,filename0);return 0;else pipe_out = NO_PIPE;if(pid = fork() 0)printf(Fork failed!n);return 0;if(pid = 0)if(pipe_in = NO_PIPE)close(pipe_in);if(pipe_out = NO_PIPE)close(pipe_out);if(pipe_o

10、ut != NO_PIPE)dup2(pipe_out,1);close(pipe_out);if(pipe_in != NO_PIPE) dup2(pipe_in,0);close(pipe_in);execv(buf,argvi); else if(is_bg = 0)waitpid(pid,NULL,O);close(pipe_in);close(pipe_out);return 0;void add_history(char * inputcmd)envhis.end = (envhis.end + 1) % HISNUM;if(envhis.end = envhis.start)en

11、vhis.start = (envhis.start + 1) % HISNUM; strcpy(envhis.his_cmdenvhis.end,inputcmd);void history_cmd()int i,j = 0;if(envhis.start = envhis.end)return;else if(envhis.start envhis.end)for(i = envhis.start + 1;i = envhis.end;i+)printf(%dt%sn,j,envhis.his_cmdi);j+;elsefor(i = envhis.start + 1;i HISNUM;i

12、+)printf(%dt%sn,j,envhis.his_cmdi);j+;for(i = 0;i = envhis.end;i+)printf(%dt%sn,j,envhis.his_cmdi); j+;void cd_cmd(char * route)if(route != NULL)if(chdir(route) pid,p - state,p - cmd); i+;p = p - link;while(p != NULL);elseprintf(No jobs!n);void add_node(char * input_cmd,int node_pid)struct NODE * p;

13、p = (struct NODE *)malloc(sizeof(struct NODE);p - pid = node pid;strcpy(p - state,input_cmd);strcpy(p - state,running);p - link = NULL;if(head = NULL)head = p;end = p; elseend - link = p;end = p;void del_node(int sig,siginfo_t * sip)struct NODE * q;struct NODE * p;int id;if(sig_z = 1)sig_z = 0;goto

14、out;id = sip - si_pid;p = q = head;if(head = NULL)goto out;while(p - pid != id & p - link != NULL)p = p - link;if(p - pid != id)goto out;if(p = head)head = head - link;else while(q - link != p)q = q - link;if(p = end)end = q;q - link = NULL;else q - link = p - link;free(p);out:return;void setflag()s

15、ig_flag = 1;void ctrl_z()struct NODE * p;int i = 1;if(pid1 = 0)goto out;if(head != NULL)p = head;while(p - pid != pid1) & (p - link != NULL)p = p - link;if(p - pid = pid1)strcpy(p - state,stopped);elseadd_node(input,pid1);strcpy(end - state,stopped);elseadd_node(input,pid1);strcpy(end - state,stoppe

16、d);sig_z = 1;kill(pid1,SIGSTOP);for(p = head;p - pid != pid1;p = p - link)i+;printf(%dt%st%sn,i,end - state,end - cmd);pid1 = 0;out:return;void bg_cmd(int job_num)struct NODE * p;int i = 0;p = head;for(i = 1;i link;kill(p - pid,SIGCONT); strcpy(p - state,running);void fg_cmd(int job_num)struct NODE

17、* p;int i = 0;p = head;for(i = 1;i link;strcpy(p - state,running); strcpy(input,p - cmd); pidl = p - pid;signal(SIGTSTP,ctrl_z);kill(p - pid,SIGCONT); waitpid(p - pid,NULL,O);int main()init_environ();while(1)char c;char * arg20;int i = 0,j = 0,k = 0;int is_pr = 0,is_bg = 0;int input_len = 0,path;int

18、 pid = 0,status = 0;struct sigaction action;action.sa_sigaction = del_node;sigfillset( & action.sa_mask); action.sa_flags = SA_SIGINFO; sigaction(SIGCHLD, & action,NULL); signal(SIGTSTP,ctrl_z);path = get_current_dir_name();printf(ysh%s ,path);while(c = getchar() = ) | (c = t) | (c = EOF) Jif(c = n)

19、continue;while(c != n)bufinput_len+ = c;c = getchar();bufinput_len = 0:input = (char *)malloc(sizeof(char) * (input_len + 1); strcpy(input,buf);for(i = 0,j = 0,k = 0;i = input_len;i+)if(inpu ti = ) | (inputi = |)if(inpu ti = T)pipel(input,input_len);add_history(input);free(input);elseredirect(input,

20、input_len); add_history(input);free(input);is_pr = 1;break;if(is_pr = 1)continue;for(i = 0,j = 0,k = 0;i = input_len;i+)if(inpu ti = ) | (inputi = 0)if(j = 0)continue;elsebufj+ = 0:argk = (char *)malloc(sizeof(char) * j); strcpy(argk+,buf);j = 0;elseif(inp uti = &) & (inputi + 1 = 0)is_bg = 1;contin

21、ue;bufj+ = inpu ti;if(strcmp(arg0,exit) = 0)add_history(input);printf(Bye bye!n);free(input);break;if(strcmp(arg0,history) = 0)add_history(input);history_cmd();free(input);continue;if(strcmp(arg0,cd) = 0)add_history(input);for(i = 3,j = 0;i = input_len;i+)bufj+ = inpu ti;bufj = 0;arg1 = (char *)mall

22、oc(sizeof(char) * j);strcpy(arg1,buf);cd_cmd(arg1);free(input); continue;if(strcmp(arg0,jobs) = 0)add_history(input);jobs_cmd();free(input);continue; if(strcmp(arg0,bg) = 0)add_history(input);for(i = 0;i = input_len;i+)if(inpu ti = %) break;i+;for(;i = input_len;i+)bufj+ = inpu ti;bufj = 0;arg1 = (char *)malloc(sizeof(char) * j); strcpy(arg1,buf); bg_cmd(atoi(arg1);free(input);continue; if(strcmp(arg0,fg) = 0)add_history(input);for(i = 0;i = input_len;i+) if(inpu ti = %) break;i+;for(;i = input_len;i+)bufj+ =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论