ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:65.06KB ,
资源ID:8861899      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8861899.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统实验报告shell程序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统实验报告shell程序.docx

1、操作系统实验报告shell程序操作系统实习报告 日期: 实习题目: 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(envpathk

3、!= 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,PATH) = 0) while(si != 0) if(si = :) buffj+ = /; buffj = 0; p

4、 = (char *)malloc(strlen(buff) + 1); strcpy(p,buff); envpathk+ = p; envpathk = NULL; j = 0; i+; else buffj = si; j+; i+; else fprintf(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

5、,n; char buf80; if(fd = 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;

6、int li_cmd = 0; int fd101,pipe_in = -1; int pipe_out = -1,flag = 0; pid_t pid; for(i = 0,j = 0,k = 0;i ) | (inputi = n) if(inputi = |) | (inputi = ) if(inputi = ) 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

7、+; k = 0; j = 0; if(j = 0) continue; else bufj+ = 0; if(flag = 0) argvli_cmdk = (char *)malloc(sizeof(char) * j); strcpy(argvli_cmdk,buf); k+; else filename0 = (char *)malloc(sizeof(char) * j); strcpy(filename0,buf); j = 0; else if(inputi = &) & (inputi = 0) is_bg = 1; continue; bufj+ = inputi; argv

8、li_cmdk+ = NULL; for(i = 0;i = 10;i+) fdiFD_READ = NO_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; else pipe

9、_in = NO_PIPE; if(i != li_cmd) pipe_out = fdiFD_WRITE; else if(flag = 1) if(pipe_out = open(filename0,O_WRONLY | O_CREAT | 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_

10、in = NO_PIPE) close(pipe_in); if(pipe_out = NO_PIPE) close(pipe_out); if(pipe_out != 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,0); close(pipe_in); close(pipe_out); return 0;void add_histor

11、y(char * inputcmd) envhis.end = (envhis.end + 1) % HISNUM; if(envhis.end = envhis.start) envhis.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 +

12、 1;i = envhis.end;i+) printf(%dt%sn,j,envhis.his_cmdi); j+; else for(i = envhis.start + 1;i HISNUM;i+) 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 =

13、p - link; while(p != NULL); else printf(No jobs!n);void add_node(char * input_cmd,int node_pid) struct NODE * p; 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; else end - l

14、ink = 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 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

15、- 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() sig_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 =

16、p - link; if(p - pid = pid1) strcpy(p - state,stopped); else add_node(input,pid1); strcpy(end - state,stopped); else add_node(input,pid1); strcpy(end - state,stopped); 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;ou

17、t: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 * p; int i = 0; p = head; for(i = 1;i link; strcpy(p - state,running); strcpy(input,p - cmd); pid1 = p - pid; signal(SIGTSTP

18、,ctrl_z); kill(p - pid,SIGCONT); waitpid(p - pid,NULL,0);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 pid = 0,status = 0; struct sigaction action; action.sa_sigaction = del_node; sigfillset(& action.sa_mask); ac

19、tion.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) ; if(c = n) continue; while(c != n) bufinput_len+ = c; c = getchar(); bufinput_len = 0; input = (char *)malloc(sizeo

20、f(char) * (input_len + 1); strcpy(input,buf); for(i = 0,j = 0,k = 0;i = input_len;i+) if(inputi = ) | (inputi = |) if(inputi = |) pipel(input,input_len); add_history(input); free(input); else redirect(input,input_len); add_history(input); free(input); is_pr = 1; break; if(is_pr = 1) continue; for(i

21、= 0,j = 0,k = 0;i = input_len;i+) if(inputi = ) | (inputi = 0) if(j = 0) continue; else bufj+ = 0; argk = (char *)malloc(sizeof(char) * j); strcpy(argk+,buf); j = 0; else if(inputi = &) & (inputi + 1 = 0) is_bg = 1; continue; bufj+ = inputi; if(strcmp(arg0,exit) = 0) add_history(input); printf(Bye b

22、ye!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+ = inputi; bufj = 0; arg1 = (char *)malloc(sizeof(char) * j); strcpy(arg1,buf); cd_cmd(arg1); free(inpu

23、t); 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(inputi = %) break; i+; for(;i = input_len;i+) bufj+ = inputi; bufj = 0; arg1 = (char *)malloc(sizeof(char) * j); strcpy(arg1,buf);

24、 bg_cmd(atoi(arg1); free(input); continue; if(strcmp(arg0,fg) = 0) add_history(input); for(i = 0;i = input_len;i+) if(inputi = %) break; i+; for(;i = input_len;i+) bufj+ = inputi; bufj = 0; arg1 = (char *)malloc(sizeof(char) * j); strcpy(arg1,buf); fg_cmd(atoi(arg1); free(input); continue; if(is_pr = 0) argk = (char *)malloc(sizeof(char); argk = NULL; if(is_founded(arg0) = 0) printf(This command is not founed!n); for(i = 0;i = k;i+) free(argi);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1