linux下实现自己的shell解释器
实现一个自己的shell解释器,其原理比较简单,首先获取用户的输入,通过fork()函数获取两个进程(父子进程),子进程通过execvp()函数继续进行,此时父进程一直在等待子进程的结束,待都结束了就执行了一次shell解释。
/*============================================
> Copyright (C) 2014 All rights reserved.
> FileName:my_shell.c
> author:donald
> date:2014/08/21/ 16:08:03
> details:
==============================================*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#define N 1024
#define ARR_SIZE 32
int save_to_arg(char line[N],char *arg[N]){
memset(arg,,sizeof(arg));
int head,tail;
char temp[ARR_SIZE];
int pos,index;
index = ;
head = ;
while(line[head] != '\0'){//分词
while(isspace(line[head]) && line[head] != '\0'){
head ++;
}
if(line[head] == '\0'){
break;
}
tail = head;
while( ! isspace(line[tail]) && line[tail] != '\0'){
tail ++;
} pos = ;
memset(temp,,ARR_SIZE);
while(head != tail){//也可以用strncpy
temp[pos] = line[head];
head ++;
pos ++;
}
//temp[pos] = ' ' ;这里不用了,存入的是二维数组中,不用空格进行分词
arg[index] = (char*)calloc(,strlen(temp));//arg是一个指向字符数组的指针,必须申请空间
//如果声明arg为一个二维数组就不用为其分配
strcpy(arg[index],temp); index ++;//!!!!!!!!!
}
arg[index] = NULL;
return index;
}
int main(int argc, const char *argv[])
{
int index,len;
char *arg[N];
char line[N];
while(memset(line,,N),printf(">>"),fflush(stdout),fgets(line,N,stdin) != NULL){//为什么用fflush?为了清理缓存
line[strlen(line)-] = '\0';
if(line[] == '\n'){
continue;
}
len = save_to_arg(line,arg); if(fork() == ){
if(execvp(arg[],arg) == -){
perror("error");
}
}else{
wait(NULL);
}
}
return ;
}
- execvp()函数非正常退出将会返回 -1 ,通过获取其值,并对其加以判断,就可以实现在用户输入shell中没有的指令时出现提示消息。
- 在键入ls时为了实现颜色,可以进行如下操作,eg:ls -l --color=auto.
linux下实现自己的shell解释器的更多相关文章
- Linux下经常使用的shell命令记录
硬件篇 CPU相关 lscpu #查看的是cpu的统计信息. cat /proc/cpuinfo #查看CPU信息具体信息,如每一个CPU的型号,主频等 内存相关 free -m #概要查看内存情况 ...
- linux下各种形式的shell加法操作总结
linux 下shell加法操作总结: #!/bin/bash n=1;echo -n "$n " let "n = $n + 1" echo -n & ...
- Linux下几种反弹Shell方法的总结与理解
之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在 ...
- Linux下最常用的Shell命令的介绍
Shell基础: 你可以通过打开Linux的terminal(终端)来执行Shell命令.Shell的种类有很多种,例如CSH,Bourne Shell,Korn Shell.在现在的大多数Linux ...
- 一个简单的linux下设置定时执行shell脚本的示例
很多时候我们有希望服务器定时去运行一个脚本来触发一个操作,比如说定时去备份服务器数据.数据库数据等 不适合人工经常做的一些操作这里简单说下 shell Shell俗称壳,类似于DOS下的command ...
- Linux下使用popen()执行shell命令【转】
本文转载自:https://my.oschina.net/u/727148/blog/262987 函数原型: #include “stdio.h” FILE popen( const char co ...
- Linux下C语言执行shell命令
有时候在代码中需要使用到shell命令的情况,下面就介绍一下怎么在C语言中调用shell命令: 这里使用popen来实现,关于popen的介绍,查看 http://man7.org/linux/man ...
- Linux 下批量创建用户(shell 命令)
第一种方法: 用shell批量创建用户,分为2中:1,批量创建的用户名无规律 :2.批量创建的用户名有规律首先,来说下批量创建的用户名无规律的shell:先把需要批量创建的用户名用一个文本文档列出来, ...
- Linux下使用popen()执行shell命令
转载 http://www.cnblogs.com/caosiyang/archive/2012/06/25/2560976.html 简单说一下popen()函数 函数定义 #include < ...
随机推荐
- 发现一个不错的学习git的地方
Git入门:http://rogerdudler.github.io/git-guide/index.zh.html 简洁.实用.高效的学习git基本操作的方式
- 解决英文版Windows程序乱码
前段时间由于工作需要装了一个英文版Windows,以至于在一些脚本和控制台程序里面处理汉字的时候总是显示乱码(比如:“???”). 在尝试了很多编码和解码的操作后,乱码问题还是没能很好的解决.后来才发 ...
- shopnc 导出Excel数据问题实例 && ajax 获取当前值并传递
任务:从商家中心导出数据,各个商品所属情况. 商品导出到Excel文件功能 /导出exel 功能make-in-lemon public function createExcelOp(){ $mode ...
- gnome-ssh-askpass:No such file or directory && unable to read askpass response
1.使用git的时候,gnome-ssh-askpass出现“error: cannot run /usr/libexec/openssh/gnome-ssh-askpass: No such fil ...
- Jquery一个slideToggle搞定div的隐藏与显示
Jquery一个slideToggle搞定div的隐藏与显示 <!DOCTYPE html> <html> <head> <script src=" ...
- 浅谈标签构建——TagBuilder
在很多项目中,可能我们需要写一些通用的控件标签,今天来简单的学习一下吧. 在前文中已经学习了 如何自定义MVC控件标签 ,感兴趣的朋友可以去看看. 今天主要还是讲解一下TagBuilder 我们打开源 ...
- HDU 4082 Hou Yi's secret(暴力)
直接6重循环就行了吧...判三角形相似直接从小到大枚举两向量夹角是否相等就行了.注意去重点跟三点共线就行了... #include<algorithm> #include<iostr ...
- Lipschitz连续【zz】
转载地址:http://moosewoler.blog.163.com/blog/static/6986605201242643122296/ 李普希兹连续是以德国数学家Rudolf Lipschit ...
- Eclipse 安装mybatis的编辑插件
1.MyEditor安装的方式 Eclipse 安装mybatis的编辑插件有以下4种方式,您可以使用下列方法之一来安装MyBatis的编辑器: Eclipse 3.7的(市场客户机安装):此图像拖放 ...
- CSS 定位 (Positioning)学习
最近被css的定位要搞疯了...下面我总结一下最近学习东西. 先介绍几个概念: 块框:div.h1 或 p 元素常常被称为块级元素.这意味着这些元素显示为一块内容,即“块框”. 行内框:与之相反,sp ...