编写自主shell

   1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <string.h>
  5 
  6 void do_shell(char **argv)
  7 {
  8     int n;
  9     if ((n=fork()) == 0)
 10     {
 11         execvp(argv[0], argv);
 12         exit(0);
 13     }
 14     else if (n > 0)
 15     {
 16         wait(NULL);
 17     }
 18     return ;
 19 }
 20 
 21 void do_parse(char *buf)
 22 {
 23     char *argv[8] = {};
 24     int argc = 0;
 25     int status = 0;
 26     int i;
 27     for (i=0; buf[i]!=0; i++)
 28     {
 29         if (!isspace(buf[i]) && status == 0)
 30         {
 31             argv[argc++] = buf+i;
 32             status = 1;
 33         }
 34         else if (isspace(buf[i]))
 35         {
 36             buf[i] = 0;
 37             status = 0;
 38         }
 39     }
 40     argv[argc] = NULL;
 41     do_shell(argv);
 42 }
 43 
 44 int main()
 45 {
 46     while (1)
 47     {
 48         char buf[1024] = {};
 49         printf("myshell:");
 50         scanf("%[^\n]%*c", buf);
 51         if (strncmp(buf, "exit", 4) == 0)
 52             exit(0);
 53         do_parse(buf);
 54     }
 55 }


自主shell原理:首先将读入的字符串分割,然后用fork创建一个子进程,在子进程中调用execvp函数来执行从读入的命令,execvp用新的程序文件替换了子进程原先的执行文件,而父进程等待子进程终止通过调用wait来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值