mybash的实现

题目

  • 使用fork,exec,wait实现mybash
  • 写出伪代码,产品代码和测试代码
  • 发表知识理解,实现过程和问题解决的博客(包含代码托管链接)

准备

通过man命令了解fork、exec和wait

  • fork

  • exec

  • wait

编程实现

  • 伪代码

    while(1)
    {
    fgets(命令行输入);
    if(内置的shell命令)
    {
    解释命令;
    }
    else if(可执行文件)
    {
    新的子进程加载并运行文件;
    }
    }
  • 产品代码

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 128 void eval(char *cmdline);
    int parseline(char *buf, char **argv);
    int builtin_command(char **argv); int main()
    {
    char cmdline[MAX]; printf("This is 20155212's bash!\n");
    while(1)
    {
    printf("> ");
    fgets(cmdline, MAX, stdin);
    if(feof(stdin))
    exit(0);
    eval(cmdline);
    }
    } void eval(char *cmdline)
    {
    char *argv[MAX];
    char buf[MAX];
    int bg;
    pid_t pid;
    strcpy(buf,cmdline);
    bg = parseline(buf,argv);
    if(argv[0]==NULL)
    return;
    if(!builtin_command(argv))
    {
    if((pid=fork()) == 0)
    {
    if(execvp(argv[0],argv) < 0)
    {
    printf("%s : Command not found.\n",argv[0]);
    exit(0);
    }
    }
    }
    if(!bg)
    {
    int status;
    if(waitpid(-1,&status,0) < 0)
    printf("waitfg: waitpid error!");
    }
    else
    {
    printf("%d %s",pid, cmdline);
    return;
    }
    } int builtin_command(char **argv)
    {
    if(!strcmp(argv[0], "quit"))
    exit(0);
    if(!strcmp(argv[0],"&"))
    return 1;
    return 0;
    } int parseline(char *buf,char **argv)
    {
    char *delim;
    int argc;
    int bg; buf[strlen(buf)-1]=' ';
    while(*buf && (*buf == ' '))
    buf++; argc=0;
    while( (delim = strchr(buf,' ')))
    {
    argv[argc++] = buf;
    *delim= '\0';
    buf = delim + 1;
    while(*buf && (*buf == ' '))
    buf++;
    }
    argv[argc] = NULL;
    if(argc == 0)
    return 1;
    if((bg=(*argv[argc-1] == '&')) != 0)
    argv[--argc] = NULL; return bg;
    }
  • 测试代码

    ls
    ls -a
    git --version
  • 运行结果

  • 码云链接

20155212 mybash的实现的更多相关文章

  1. 2017-2018-1 20155239 《信息安全系统设计基础》第五周学习总结+mybash的实现

    2017-2018-1 20155239 <信息安全系统设计基础>第五周学习总结+mybash的实现 mybash的实现 使用fork,exec,wait实现mybash 写出伪代码,产品 ...

  2. 20155212 实验四 《Android程序设计》 实验报告

    20155212 实验四 <Android程序设计> 实验报告 (一)Android Stuidio的安装测试 参考<Java和Android开发学习指南(第二版)(EPUBIT,J ...

  3. Mybash的实现

    Mybash的实现 要求: 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解,实现过程和问题解决的博客(包含代码托管链接) 背景知识 1. fork 使用 ...

  4. 2017-2018-1 20155215 第五周 mybash的实现

    题目要求 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解,实现过程和问题解决的博客(包含代码托管链接) 学习fork,exec,wait fork ma ...

  5. 2017-2018-1 20155306 《信息安全系统设计基础》Mybash的实现

    2017-2018-1 20155306 <信息安全系统设计基础>Mybash的实现 要求: 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解 ...

  6. 20165223 《信息安全系统设计基础》 实现mybash

    一.了解 mybash 1. 简介   bash 是 Bourne Again Shell 的缩写,是linux默认的标准shell(也是大家常说的系统内核),bash也是Unix/Linux上常见的 ...

  7. 20165220 mybash

    使用fork,exec,wait实现mybash - 写出伪代码,产品代码和测试代码 - 发表知识理解,实现过程和问题解决的博客(包含代码托管链接) 1.fork 功能:创建一个新的进程 一个现存进程 ...

  8. 实现mypwd和mybash

    一.pwd 1.学习pwd命令 man pwd查看pwd功能 可以得知pwd功能是打印当前目录 2.研究pwd实现需要的系统调用(man -k; grep),写出伪代码 (1)man -k direc ...

  9. 实现mybash

    任务内容 1.使用fork,exec,wait实现mybash 查找资料: fork函数 通过fork()系统调用我们可以创建一个和当前进程印象一样的新进程.我们通常将新进程称为子进程,而当前进程称为 ...

随机推荐

  1. 【深入理解JAVA虚拟机】读后感

    收获颇多的一本书,非常值得细细品味. 1.所谓万变不离其宗,此书便是宗.读过此书后,发现以前看过的网上好多五花八门的文章,都是源自此书. 2.举一反三.此书中讲到的jvm用到的各种思想,在工作中其实经 ...

  2. spark中利用Sql2o连接数据的例子BlogService

    最近在看学习Spark Framework. 这是一个web框架,宗旨正如其官网LInk所示:Spark - A micro framework for creating web applicatio ...

  3. 团队作业—预则立&&他山之石(人月神教)

    1.团队任务 GitHub issues 1.2 团队计划 2.访谈任务 2.1采访对象 采访团队:龙威零式 采访时间:2017.10.23 采访形式:微信群 2.2采访内容 问:你们选题的时候有哪些 ...

  4. 关于由ajax返回的数据在for循环中只能取到最后一个数的问题

    关于由ajax返回的数据在for循环中只能取到最后一个数的问题 以上是来自后台的数据格式.从数据中可以看出,里面包含两个商品,每个商品价格分别为:1.98,13.60.这里我要计算两个商品的总价格,但 ...

  5. 关于memcpy的实现

    今天去面试,面试官出了一个关于memcpy的函数原型的实现的问题,本来这个问题是很简单的,但是不知道当时怎么脑子一抽竟然写错了,真是”累觉不爱”了.感觉这份工作算是泡汤了,算了事情发生了,错过了也就错 ...

  6. less使用总结

    15年自学了 less ,可是一直没用,就忘记了.后来抱着提高 css 开发速度的目的,又去学习了 less ,学完马上用,效果立竿见影,记得也牢了.刚开始学习前,我们总会问自己一个问题,学习它有什么 ...

  7. 在windows下解压缩rar文件

    这是一篇比较无聊的博文.只是给博客除草的. 我从我的移动硬盘里翻出来了一堆电子书,从哪拿到的我忘了,但是都打在rar的压缩包里,这让我查找起来非常不方便.前几天找某本书看,就没有查到,又百度到的下载地 ...

  8. Codeforces441A_Valera and Antique Items(水题)

    Valera and Antique Items time limit per test 1 second memory limit per test 256 megabytes input stan ...

  9. element-ui : <el-table> 按钮点击操作阻止@row-click

    描述:<el-table> 点击行时,会跳转到一个详细信息页面, 但是同时这一行也有编辑和删除按钮. 问题: 在点击按钮时,@row-click事件也被触发了,而我并不想触发 row-cl ...

  10. docker-5-容器数据卷

    1.是什么 一句话:有点类似我们Redis里面的rdb和aof文件   先来看看Docker的理念: *  将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 ...