#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<pwd.h>
#include<limits.h>
#include<bits/local_lim.h>

int main(int argc, const char *argv[])
{
    while(1){
        int i=0,j=0,p=0;
        char buf[100]={0};              //存储命令
        char host[HOST_NAME_MAX]={0};   //存储主机名
        gethostname(host,sizeof(host));
        uid_t uid=getuid();             //uid
        char pwd[PATH_MAX]={0};         //用于存储当前路径
        getcwd(pwd,sizeof(pwd));
        printf("%s@%s %s%c ",getpwuid(uid)->pw_name,host,pwd,getuid()?'$':'#');fflush(stdout);
        gets(buf);
        char* ag[5]={0};
        for(i=0;i<5;i++){
            ag[i]=(char* )malloc(sizeof(10));
        }
        //将命令分解为字符串数组
        i=0;
        while(1){
            if(' '==buf[i]){
                strncpy(ag[j],buf+p,i-p);
                p=i+1;
                j++;
            }

            if('\0'==buf[i]){
                strncpy(ag[j],buf+p,i-p);
                ag[j+1]=NULL;   //exevp()需要
                break;
            }
            i++;
        }

        //处理cd
        if(!strcmp("cd",ag[0])){
            if(!strcmp("~",ag[1])){
                char tmp[20]="/home/";//,usr);
                ag[1]=strcat(tmp,getpwuid(uid)->pw_name);
            }

            char newPath[100]={0};
            strcpy(newPath,ag[1]);
            chdir(newPath);
            continue;
        }
        //处理ls *
        if(!strcmp(ag[0],"ls") && NULL!=ag[1] && !strcmp(ag[1],"*")){
            strcpy(ag[1],".");
            ag[2]=NULL;
        }

        pid_t pid=fork();
        if(0==pid){
            //重定向
            if(NULL!=ag[2] && !strcmp(ag[2],">")){
                FILE* fp1=freopen(ag[3],"w+",stdout);
            }
            if(NULL!=ag[2] && !strcmp(ag[2],">>")){
                FILE* fp2=freopen(ag[3],"a+",stdout);
            }
            if(NULL!=ag[2] && !strcmp(ag[2],"2>")){
                FILE* fp3=freopen(ag[3],"w+",stderr);
            }
            if(NULL!=ag[2] && !strcmp(ag[2],"<")){
                FILE* fp4=freopen(ag[3],"w+",stdin);
            }
            execvp(ag[0],ag);
        }
        else{
            wait(NULL);
        }
    }
    return 0;
}

执行结果

$./a.out
linux@ubuntu /home/linux/Desktop/161028$ ls
1  2  a.out  my_shell.c
linux@ubuntu /home/linux/Desktop/161028$ ls -l
total 24
-rw-rw-r-- 1 linux linux 2008 10月 28 21:15 1
-rw-rw-r-- 1 linux linux 4312 10月 28 21:18 2
-rwxrwxr-x 1 linux linux 7837 10月 29 12:48 a.out
-rw-rw-r-- 1 linux linux 1892 10月 29 12:48 my_shell.c
linux@ubuntu /home/linux/Desktop/161028$ cd ..
linux@ubuntu /home/linux/Desktop$ ls -l > 1
ls: cannot access >: No such file or directory
linux@ubuntu /home/linux/Desktop$ cat 1
-rw-rw-r-- 1 linux linux 0 10月 29 12:52 1
linux@ubuntu /home/linux/Desktop/hqyj$   

my_shell的更多相关文章

  1. sql server 2012 数据引擎任务调度算法解析(下)

    上次我们说到,sql server 2012的企业版的任务调度流程,一直到给新连接分配了scheduler,都是与以前的版本算法是一致的,只有在进行任务分配的时候,算法才有了细微的调整. 新算法的目的 ...

  2. sql server 2012 数据引擎任务调度算法解析(上)

    微软在sql server 2012版本之后,引入了新的任务调度算法,这个算法与之前的版本有一些细微的差别.我在这里试着简单描述一下,一些基本概念就不再赘述了,比如NUMA.scheduler.wor ...

  3. 发现一php木马代码

    <?php ;//无需验证密码! $shellname='hello~地球~猴子星球欢迎你 '; define('myaddress',__FILE__); error_reporting(E_ ...

  4. M_LROOT,LD_LIBRARY_PATH, “Not all extension Dlls were loaded”问题原因及解决方法(持续更新)

    最近在需要在云主机上进行压力测试,所以需要Linux的Agent. 一.安装:教程可以百度,大概步骤如下: 1.Upload Linux.zip to 指定的机器 2.解压,chmod 777 $Li ...

  5. linux下实现自己的shell解释器

    实现一个自己的shell解释器,其原理比较简单,首先获取用户的输入,通过fork()函数获取两个进程(父子进程),子进程通过execvp()函数继续进行,此时父进程一直在等待子进程的结束,待都结束了就 ...

  6. 测者的性能测试手册:快速安装LoadRunner Linux上的Generator

    安装和初始化 安装包 上传Linux.zip(LoadRunner Generator for Linux.zip,后台回复loadrunner获取下载地址),然后通过如下命令: unzip Linu ...

  7. linux命令(37):paste,合并两个文件,对应行为一行

    paste的格式为: paste -d -s -file1 file2 选项的含义如下: -d 指定不同于空格或t a b键的域分隔符.例如用@分隔域,使用- d @.如果不指定,默认用空格分割 -s ...

  8. django项目中使用项目环境制作脚本 通过终端命令运行脚本文件

    在实际的django项目开发中,有时候需要制作一些脚本文件对项目数据进行处理,然后通过终端命令运行脚本. 完整的实现流程如下: 1.在一个应用目录下(app, 必须是在应用目录下,可以专门创建一个应用 ...

  9. 解决命令行执行shell脚本成功,但crontab执行失败

    实际生产案例 生产机房自建PPTP客户端通过拨号连接到生产机房,但是一旦客户端网络是意外断线再重新拨号 会产生IP冲突,于是写了一个脚本监控PPTP的IP是否有多个(一般冲突以后会生成2个IP) #! ...

随机推荐

  1. hash简单介绍

    hash也称"散列", 是一种基于映射关系的存储方式,将任意长度的二进制值输出为固定长度的较小的二进制值,这种输出的小的固定长度的值为hash值: 1. 散列技术是在关键字key与 ...

  2. malloc和new的区别

    (1)malloc在C和C++中都可以使用,用来申请一段内存:申请的内存一定要用free释放,然后把指针置为null: new只能在C++中使用,用于动态内存分配:new的对象要delete掉: (2 ...

  3. PHP 批量生成静态文件目录代码

    <?php /** * @author:jiangzaixing 20160314 * 获取静态文件方法 */ class StaticFile { const MAP_FILE_NAME = ...

  4. servlet的开发流程介绍

    servlet的开发部署流程 1.在%TOMCAT_HOME%/webapps下WEB-INF的文件夹,写一个文件web.xml(该网站的配置信息),建立一个classes的子文件夹,也可以从别的目录 ...

  5. WinForm 窗体应用程序 (初步)之二

    现在,我们来了解一些基本控件.控件是放置在工具箱里的,你可以在界面的左侧或者通过菜单栏的视图选项找到它. (1)Label 控件 这是一个用于放置文字的控件,因为你不能在窗体上直接输入文字. (2)T ...

  6. 【初窥javascript奥秘之事件机制】论“点透”与“鬼点击”

    前言 最近好好的研究了一番移动设备的点击响应速度,期间不断的被自己坑,最后搞得焦头烂额,就是现在可能还有一些问题,但是过程中感觉自己成长不少, 最后居然感觉对javascript事件机制有了更好的认识 ...

  7. [deviceone开发]-模仿Zaker的示例

    一.简介 这个示例模仿zaker这个App,主要的界面基本都完成,用到了各种deviceone提供的ui组件,比如GridView,ListView,ScrollView,ViewShower等等.初 ...

  8. ArcGIS JS 学习笔记2 实现仿百度的拖拽画圆

    一.前言 吐槽一下,百度在国内除了百度地图是良心产品外,其他的真的不敢恭维.在上一篇笔记里,我已经实现了自定义的地图测量模块.在百度地图里面(其他地图)都有一个周边搜索的功能,拖拽画一个圆,然后以圆半 ...

  9. 阿里云服务器怎么去掉tomcat的8080端口

    前言:最近在阿里云申请了一个云服务器,然后已买了一个域名.比如www.haha.com ; 在云服务器上安装了tomcat ,访问服务器就成了 http://www.haha.com:8080/ . ...

  10. AFNetwork2.0在报错1016,3840的解决方法及一些感悟

    最近在学习AFNetwork,非常好的网络框架,能节省很多时间.不过请求网络数据时报错1016,3840. 这两个错误网上解决方法很多,http://blog.csdn.net/huifeidexin ...