用C实现一个简单的交互式shell,要求:当用户输入一行命令时,识别程序名和参数并调用适当的exec函数执行程序,等待执行完成后给出提示符。

  exec函数实际上是六种以exec开头的函数,统称exec函数。当进程调用exec函数时,该进程的用户空间和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec函数前后该进程的id并未改变。exec函数中execve是系统调用,剩下的其他都是适用于不同场景下,稍有不同,因此在这里就不赘述了。

  自己实现shell的代码如下:

   #include<stdio.h>

   #include<unistd.h>

   #include<sys/types.h>

   #include<stdlib.h>

   #include<wait.h>

   #include<pwd.h>

   #include<string.h>

   void GetLoginName()//获取登录名

  {

    struct passwd *pwd;

    pwd=getpwuid(getuid());

    printf("[%s@",pwd->pw_name);

  }

   void GetHostName() //获取主机名

  {

   char name[100]={0};

   gethostname(name,sizeof(name)-1);

   printf("%s",name);

  }

   void GetDir() //获取当前工作目录

  {

    char pwd[100]={0};

    getcwd(pwd,sizeof(pwd)-1); //pwd保存的是绝对路径

    int len=strlen(pwd);

    char* p=pwd+len;

    while(*p!='/'&&len--)

    {

      p--;

    }

    p++;

    printf(" %s]#",p);

   }

   void myShell()

   {

    while(1)

    {

      GetLoginName();

      GetHostName();

      GetDir();

      fflush(stdout);

      char line[1024]; //获取输入的命令,并解析

      ssize_t s=read(0,line,1024);

      char* myArgv[10];

      char* start=line;

      myArgv[0]=start;

      int i=1;

      if(s>0)

      {

        while(*start) //以空格将输入的内容区分开

        {

          if(isspace(*start))

          {

            while(isspace(*start))

            {

              *start='\0';

              start++;

            }

            myArgv[i++]=start;

          }

          else

         {

           start++;

         }

      }

     }

     else

     {

      continue;

     }

     myArgv[i-1]=NULL;

     pid_t id=vfork(); //fork子进程去执行输入的命令

     if(id==0)

     {

       execvp(myArgv[0],myArgv);

       perror("error ");

     }

     else

     {

       sleep(1);

       wait(NULL);

     }

     printf("\n");

  }

}

 int main()

{

  myShell();

  return 0;

}

自己实现一个shell的更多相关文章

  1. Linux Shell编程(2)——第一个shell程序

    在最简单的情况下,脚本程序不过是存储在一个文件里的系统命令列表.这至少让你执行它 时不必重新按顺序键入相同功能的命令序列.一个清空/var/log目录下的日志文件的脚本 # Cleanup # 必须以 ...

  2. Linux Shell 之 我的第一个Shell程序

      这里我首先会介绍一个Shell是什么,再介绍我的第一个Shell程序和从中总结的经验. 一.Shell是什么 在说我的这个Shell程序之前,还是先跟大家说说什么是Shell吧,相信Shell这个 ...

  3. shell脚本中执行另一个shell脚本

    分类: 可以在一个shell脚本中执行另一个shell脚本(或非可执行文件,主要用于取得一些变量的值),方法是: . 文件名(包括路径) 或 变量=文件名(包括路径) . $变量   注意,圆点后面有 ...

  4. 手把手教你做一个Shell命令窗口

    这是一个类似于win下面的cmd打开后的窗口,可以跨平台使用,可以在win和linux下面同时使用,主要功能如下: 首先我们需要把这些功能的目录写出来,通过写一个死循环,让其每次回车之后都可以保持同样 ...

  5. 编写第一个 Shell 脚本

    什么是 Shell 脚本? 一个 shell 脚本就是一个包含一系列命令的文件.shell 读取这个文件,然后执行 文件中的所有命令,就好像这些命令已经直接被输入到了命令行中一样. 怎样编写一个 Sh ...

  6. Shell教程 之第一个shell脚本

    1.第一个shell脚本 打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行 输入一些代码 #!/bi ...

  7. 第一个shell程序

    前言:我为什么又来学习shell呢?因为这个轻量级的编程小脚本语言能够帮我处理一些基于linux的复杂手工工作.真是一言难尽,学会一门又来一门!! 看了2天这个教程,试着写了一个小脚本,没啥技术含量, ...

  8. 向大家分享一个shell脚本的坑

    打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...

  9. 编写第一个Shell脚本【TLCL】

    怎样编写一个 Shell 脚本 编写一个脚本 使脚本文件可执行 把脚本放到Shell能够找到的地方 脚本文件格式 #!/bin/bash # This is our first script. ech ...

  10. Linux Shell系列教程之(二)第一个Shell脚本

    本文是Linux Shell系列教程的第(二)篇,更多shell教程请看:Linux Shell系列教程 通过上一篇教程的学习,相信大家已经能够对shell建立起一个大体的印象了,接下来,我们通过一个 ...

随机推荐

  1. freeswitch由于ext-sip-ip地址填写错误导致32秒拆线问题

    通话32秒左右就断掉 检查 profile 的 ext-sip-ip 设置ext-rtp-ip和ext-sip-ip 可以直接设置为外网IP 自建stun-server, 更新后, 过了好几个小时出现 ...

  2. Python_11-正则表达式

    目录: 1.1      引言 1.2      python 正则式概述及常用字符 1.2.1       元字符 1.2.2       用 "" 开始的特殊字符所表示的预定义 ...

  3. Inversions SGU - 180

    这个是逆序对的裸题哇 归并排序或者树状数组~ 树状数组的话需要离散化一下··· emm确实很水很水很水··· 归并排序: #include <cstdio> #include <al ...

  4. 146. LRU Cache (List, HashTable)

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  5. C++——堆、栈、静态存储区

      栈 堆 静态存储区 生命周期 函数结束即释放 new,malloc开辟,delete,free释放 释放前,一直存在 最长,程序退出才释放   程序.局部变量 new,malloc申请的空间,用于 ...

  6. How to Get the Length of File in C

    How to get length of file in C //=== int fileLen(FILE *fp) { int nRet = -1; int nPosBak; nPosBak = f ...

  7. 注意for循环中变量的作用域-乾颐堂

    1 2 for e in collections:     pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循 ...

  8. Greeplum 系列(六) 备份与恢复

    Greeplum 系列(六) 备份与恢复 http://www.dbdream.com.cn/category/greenplum/ 先介绍几个命令查看 Greenplum 集群状态: # 1. 查看 ...

  9. CENTOS7 YUM安装BOOST1.53(静态版本)

    按照之前的博文更新163的源之后,执行: yum install boost-static.i686 yum install boost-devel.i686 yum install boost-do ...

  10. 黑盒测试实践-任务进度-Day04

    任务进度11-29 使用工具 selenium 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 经过了前两天的学习任务的安排,以下是大家的任务进度: 华同学(任务1) 1.和其他小 ...