- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)