操作系统实验四:Shell的实现.pdf

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
操操作作系系统统实实验验四四::Shell的的实实现现 ⼀⼀、、实实验验内内容容 H1 实现具有管道、重定向功能的shell 能够执⾏⼀些简单的基本 令,如进程执⾏、列⽬录等。 ⼆⼆、、实实验验⽬⽬的的 H1 1.学习并理解linux 中shell的知识; 2.重点学会编程实现管道和重定向的功能; 3.实现⾃⼰的shell 三三、、设设计计思思路路和和流流程程图图 H1 1.对对输输⼊⼊的的 令令进进⾏⾏解解析析 H2 实验内容主要是管道和重定向,这两个功能涉及shell“|”和“<”以及“>”等不同符号,所以要对输⼊的 令进⾏解析。初步按照空格来分,之后再按照<、 >、|这些涉及管道和重定向的符号来分。 2.简简单单 令令的的执执⾏⾏ H2 使⽤函数execvp可以实现简单的 令,这些 令暂时不涉及管道和重定向,函数原型为int execvp(const char *file ,char * const argv [ );,execvp()会 从PATH 环境变量所指的⽬录中查找符合参数file 的⽂件名,找到后便执⾏该⽂件,然后将第⼆个参数argv传给该欲执⾏的⽂件。为了不造成阻塞,这 ⾥启⽤了⼀个新线程实现它,最后⽗进程需等待⼦进程,以回收分配给它的资源。下⾯有些地⽅也⽤到这种⽅法。 3.输输⼊⼊输输出出重重定定向向的的实实现现 H2 实现重定向的主要函数是freopen,FILE *freopen( const char *path, const char *mode, FILE *stream );path: ⽂件名,⽤于存储输⼊输出的⾃定义⽂件 名。 mode: ⽂件打开的模式。和fopen中的模式 (如r-只读, w-写)相同。 stream: ⼀个⽂件,通常使⽤标准流⽂件。函数实现重定向,把预定义的标 准流⽂件定向到由path指定的⽂件中。要注意的是第⼆个参数,刚开始我是⽤的a+,结果每次输出都加到⽂件末尾。后来查了⼀下,改成w+可以先清 空再写⼊⽂件。 4.管管道道功功能能的的实实现现 H2 令之间通过|符号来分隔,使⽤pipe函数来建⽴管道。如何分隔这些 令呢?上⾯是写⼀个函数通过空格来分离每个字符串,这⾥通过strtok_r函数 来分隔 令。利⽤pipe函数⽣成的的读取端和写⼊端,第⼀条 令的输出作为第⼆条 令的输⼊,从⽽实现管道的功能。 四四、、主主要要数数据据结结构构及及说说明明 H1 主要使⽤了数组和指针,存放相关的 令,通过字符串操作实现⼀些基本的逻辑。 五五、、源源程程序序并并附附上上注注释释 H1 上⾯所说的设计思路与程序中的函数是对应的。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <string.h> #include <sys/stat.h> #include<signal.h> #include <fcntl.h> #define hist_size 1024 char *hist[hist_size ; int f = 0; //to save change in directory int head = 0, filled = 0; // 1-parse user's input void parse(char *word, char **argv) { int count = 0; memset(argv, 0, sizeof(char*)*(64)) ;//copies 0 to the first 64 characters of the string pointed to by the argument argv. char *lefts = NULL; const char *split = " "; //setting delimeter while (1) { char *p = strtok_ r(word, split, &lefts) ;//ref-"strtok-r":/view/6991509.htm?fr=aladdin if (p == NULL) { break; } argv[count = p;//argv is

文档评论(0)

159****3029 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

认证主体祝**

1亿VIP精品文档

相关文档

相关课程推荐