Mit6.828 HW2 Shell
2016-05-17 13:46
537 查看
HW2:shell
编写1个简单的sell,识别并执行命令,同时支持重定向和管道操作。测试脚本(t.sh):
ls > y cat < y | sort | uniq | wc > y1 cat y1 rm y1 ls | sort | uniq | wc rm y
主要代码处:
case ' ': //普通命令 ecmd = (struct execcmd*)cmd; if(ecmd->argv[0] == 0) exit(0); /*fprintf(stderr, "exec not implemented\n");*/ if(!access(ecmd->argv[0], F_OK)) //cmd exists in current directory or not execv(ecmd->argv[0], ecmd->argv); else{ strcpy(path, root); strcat(path, ecmd->argv[0]); //cmd exists in /bin or not if(!access(path, F_OK)) execv(path, ecmd->argv); else fprintf(stderr, "%s: Command not found.\n", ecmd->argv[0]); } break; case '>': //输入输出重定向 case '<': rcmd = (struct redircmd*)cmd; //fprintf(stderr, "redir not implemented\n"); close(rcmd->fd); //close stdin or stdout if(open(rcmd->file, rcmd->mode, 0777) < 0) { //open file with fd 0(stdin) or 1(stdout) fprintf(stderr, "open %s failed!\n", rcmd->file); exit(0); } runcmd(rcmd->cmd); break; case '|': //管道 pcmd = (struct pipecmd*)cmd; //fprintf(stderr, "pipe not implemented\n"); if(pipe(p) < 0){ fprintf(stderr, "create pipe failed!\n"); exit(0); } if(fork1() == 0){ //left cmd close stdout to redirect to pipe's input close(1); dup(p[1]); close(p[0]); close(p[1]); runcmd(pcmd->left); } if(fork1() == 0){ //right cmd close stdin to redirect to pipie's output close(0); dup(p[0]); close(p[0]); close(p[1]); runcmd(pcmd->right); } close(p[0]); close(p[1]); wait(&r); wait(&r); break;
主要思路:
1.普通命令:通过access函数判断当前目录是否存在该命令,如果不存在则到/bin目录下寻找。最后使用execv函数执行 命令。(附exec函数簇)
2.重定向命令:关闭重定向命令的文件描述符,然后使用open命令打开重定向文件,由于open命令会自动选择最小的文 件标识符0(标准输入)或者1(标准输出),实现重定向。
3.管道命令:在父进程中创建1个无名管道,再fork 2个子进程,关闭管道左边进程的标准输出,使用dup函数复制管道输 入标识符(使1代表管道输入),关闭管道输入输出标识符;关闭管道右边进程的标准输入,使用dup函数复制管道输处标 识符(使0代表管道输出),最后关闭父进程管道的输入输出标识符(防止干扰)。
附:shell.c
相关文章推荐
- 解决部分国产机连不上adb shell的办法
- android 命令(adb shell)进入指定模拟器或设备
- shell 下不能使用tab补全命令
- shell命令-sed
- 关于LINUX权限(启动tomcat)-bash: ./startup.sh: Permission denied
- 怎么学好,使用好shell
- Shell 实现多任务并发
- shell脚本的使用---cut截取数据
- shell脚本的使用---if条件判断
- Shell - 15
- shell脚本的使用---while循环
- 通过JAVA在命令行(如控制台)运行Shell指令
- shell脚本下常用的符号组合及转移字符
- shell脚本的使用---for循环
- linux运维人员必会的22道shell编程面试题及视频讲解
- 【Linux】shell之正则表达式
- 开发shell脚本检查Nginx实战分享
- 一道企业shell编程实战题-看看谁能快速搞定
- shell脚本的使用---if变量编写lamp管理脚本
- linux 基础与shell编程[笔记]