• 实现一个 myshell


    重点


      1、动手前首先要想清楚为什么实现一个 shell 要用到 fork (创建子进程),为什么不能把活全由 shell 干了呢?原因其实很简单,进程是运行的程序,一个进程就只能有一个程序(这个知识点涉及到 CS:IP 与 CPU控制权的内容),想让一个程序把其他所有程序的活都干了,显然不可能,所以 shell 相当于是一个命令解析器,把命令解析好找到对应的可执行文件后就 fork 一个子进程,将可执行文件加载入内存,运行程序,程序结束后再把结果返回给 shell,关闭进程,在父进程中显示结果,同时维持可输入状态,不能因为输入一条指令后 shell 程序就终止运行了。

      2、理解如何实现一个管道命令。管道命令的每一条cmd都有stdin、stdinout,写入第一条命令时你需要一个子进程,读出第一条cmd的stdout并作为第二条cmd的stdin时你又需要一个进程,所以这里需要再fork一次。所以在shell中实现一个管道命令,你需要用两次fork(),第一次fork中,父进程去跑shell,子进程跑管道命令的左边那条命令;第二次fork中,父进程(前一次fork中的子进程)去跑左边的命令,子进程(相当于前一次fork中父进程的孙子进程)去跑右边的命令。

      

    坑点


      exec函数族的参数很坑,因为它要形如main函数的参数argv,argv是一个char **数组(即可当作是一维的字符串数组)且最后一位是NULL,注意argv最后一位必须是NULL,也就是说你传入的参数也要是一个末尾是NULL的字符串数组这个细节编译器不会报语法错误,但是执行到这一步的时候就会出现各种报错、core dump。

     

    代码


      已放在github上,地址:https://github.com/bw98/git_repo/tree/master/myshell

    ————全心全意投入,拒绝画地为牢
  • 相关阅读:
    Centos7安装gitlab私服
    SpringBoot2.x开发WebSocket
    java中 DecimalFormat格式的定义
    Docker部署Reids实战单机、集群
    CCF地铁修建
    C题:A Water Problem(dp||搜索)
    A题:Common Substrings(KMP应用)
    HDU 1879 继续畅通工程(Prim||Kruscal模板题)
    魔兽世界之一:备战(模拟)
    F题:等差区间(RMQ||线段树)
  • 原文地址:https://www.cnblogs.com/Bw98blogs/p/7615834.html
Copyright © 2020-2023  润新知