模拟实现shell,使它支持重定向功能

10人阅读 评论(0) 收藏 举报
分类:

我们都知道用户是通过操作系统来对我们的硬件或者软件进行操作的,但是我们平时在使用计算机的时候并没有直接与操作系统进行交流。而在linux下我们通常通过终端输入命令,但是你有没有想过为什么我们在终端输入命令,操作系统就能认识呢?这中间存在一个命令行解释器shell,也就是所谓的外壳程序,来对我们输入的命令进行解释,调用相关的系统调用接口,从而实现各种操作。在这里我们就来模拟一个shell。

要模拟shell,我们首先得知道shell的工作原理:在我们打开终端的同时,我们也就将shell这个进程加载到内存中了,而对于我们输入的每一条命令,它也就是一个个可执行程序,也就是我们的shell这个进程通过fork()这个系统调用生成的子进程,shell这个进程本身并不会执行我们的命令功能,而是让它的子进程去执行对应操作,而它自己则是等待子进程返回,来回收子进程的资源。

要模拟实现shell,必然要和shell的功尽量贴切,而对于shell有一项功能需要注意,就是输出重定向。

对于我们的输出重定向,无非就是对于我们的输出在显示器文件上的东西重新定位到我们的文件中,所以这里只要对于文件描述符“1”进行关闭,而之后打开我们的文件即可(文件描述符1------stdout(原本时输出到显示器文件))

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<ctype.h>
int main(){
while(1){
pid_t pid = fork();
if(pid == 0){
printf("[Myshell@localhost]$");
fflush(stdout);
char buf[1024];
ssize_t readnum  = read(0,buf,sizeof(buf)-1);
if(readnum > 0){
buf[readnum-1] = 0;//处理'\0'
}
char* start = buf;
char* argv[32];
memset(argv,0,32);
argv[0] = start;
ssize_t index = 1;
while(*start){
if(isspace(*start)){
*start = '\0';
start++;
if(*start == '>'){
start++;
while(isspace(*start)){
start++;
}
char filename[32];
int idx = 0;
while(!isspace(*start)&&*start!='\0'){
filename[idx] = *start;
idx++;
start++;
}
filename[idx] = '\0';
close(1);
int fd = open((const char*)filename,O_WRONLY|O_CREAT,0644);
}
else
argv[index++] = start;
}
else{
start++;
}


}
argv[index] = NULL;
execvp(argv[0],argv);
exit(1);
}
else{
waitpid(pid,NULL,0);
}
}
return 0;

}


查看评论

模拟实现shell---“支持重定向功能”

首先,在开始本篇博文之前,我们先得了解什么是shell? 我们都知道用户是通过操作系统来对我们的硬件或者软件进行操作的,但是我们平时在使用计算机的时候并没有直接与操作系统进行交流,具体关于操作系统的...
  • chenkaixin_1024
  • chenkaixin_1024
  • 2017-05-29 22:52:38
  • 358

Linux shell的模拟,并实现输出重定向

#include #include #include #include #include #include #include #include #include int main() ...
  • sinat_36118270
  • sinat_36118270
  • 2017-05-22 11:42:57
  • 251

SHELL重定向和管道的实现

原文链接I have been always fascinated about the design of UNIX. I am still curious and enjoy the philoso...
  • c__ilikeyouma
  • c__ilikeyouma
  • 2015-12-01 11:29:52
  • 1317

Shell I/O重定向的原理解释

在Unix系统中,每个进程都有STDIN、STDOUT和STDERR这3种标准I/O,它们是程序最通用的输入输出方式。几乎所有语言都有相应的 标准I/O函数 ,比如,C语言可以通过scanf从终端输入...
  • beautysleeper
  • beautysleeper
  • 2016-09-18 14:09:55
  • 678

在Linux实现的功能简单的模拟 shell

  • 2009年09月09日 22:23
  • 7KB
  • 下载

实现一个简单shell(支持重定向)

5.16更新:支持重定向我们知道对于Linux,shell就是个命令行解释器,当我们输入相关的命令,会去执行相关的操作。比如当我们输入ls -a -l命令,shell就会打印出当前目录的内容,这是如何...
  • xy913741894
  • xy913741894
  • 2017-05-10 22:55:37
  • 1148

shell浅谈之八I/O重定向

一、简介       I/O重定向用于捕获一个文件、命令、程序或脚本甚至代码块的输出,然后把捕获到的输出作为输入发送给另外一个文件、命令、程序或脚本等。I/O重定向最常用的方法是管道(管道符"|...
  • taiyang1987912
  • taiyang1987912
  • 2014-09-24 21:02:12
  • 4679

linux下C语言实现myshell模拟shell终端

/********************************************* * 文件名:myShell.c * 功能描述:模拟终端shell并实现shell外部命令 * 编辑人...
  • aiwangtingyun
  • aiwangtingyun
  • 2018-03-21 11:04:30
  • 29

Linux——实验一:Shell程序设计

 [ 实验目的 ] 理解Shell程序的设计方法;熟悉Shell程序的编辑、运行、调试方法与过程。  [ 实验内容 ] 考勤模拟Shell程序设计 用shell设计一...
  • ggGavin
  • ggGavin
  • 2014-03-19 10:50:24
  • 3583

Linux C实现简单的shell

Linux C下实现简单的Shell 宗旨:技术的学习是有限的,分享的精神的无限的。 【需求描述】 用各种C函数实现一个简单的交互式Shell: 1、给出提示符,让用户输入一行命令,识别程序...
  • a1314521531
  • a1314521531
  • 2016-04-02 09:00:23
  • 2343
    个人资料
    持之以恒
    等级:
    访问量: 819
    积分: 311
    排名: 24万+
    文章存档