shell的简单实现

主要思路:

  • 获取命令行
  • 解析命令行
  • 建立一个子进程
  • 替换子进程程序
  • 父进程等待子进程退出

代码如下

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

char *argv[ 8 ]  ;
int argc=0;

void do_parse(  char *buf)
{
      int i;
      argc=0;
      int status=0;
      for(  ;buf[  i]!=0;i++)
      {
            if(  !isspace(  buf[  i])&&status==0)
            {
                  argv[argc++]=buf+i;
                  status=1;
            }
            else if(  isspace(  buf[i]))
            {
                  status=0;
                  buf[  i]=0;
            }
      }
      argv[  argc];

}
void do_execute(  void)
{
      pid_t pid=fork(  );//创建子进程
      if(  pid<0)
      {
            perror(  " fork ");
            exit(  EXIT_FAILURE);
      }
      else if(  pid==0)
      {
            execvp(  argv[  0],argv);  //子进程替换程序
            perror(  "  execvp");
            exit(  EXIT_FAILURE);
      }
      else
      {
            int st;
            while(  wait(  &st)!=pid)  //父进程等待
            {
                  ;
            }
      }
}
int main(  )
{


    char buf[  1024];
    while(  1)
    {

        printf(  "  myshell> ");
        fflush(  stdout);
        scanf(  "  %[ ^\n ]*c",buf);    //命令行读取
        do_parse(  buf);

        do_execute(  );
    }
    return 0;
}


运行结果:

root@localhost my_shell]# ./a.out
  myshell> ls
Segmentation fault (core dumped)
[root@localhost my_shell]# pwd
/home/zyc/linux/file_io/my_shell
[root@localhost my_shell]# cd ..
[root@localhost file_io]# cd my_shell
[root@localhost my_shell]# cat my_shell.c

这只是一个简单的shell,不支持重定向,也不支持追加功能
后续会继续更行…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值