重点


  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

实现一个 myshell的更多相关文章

  1. 为什么很多人坚信“富贵险中求”?

    之家哥 2017-11-15 09:12:31 微信QQ微博 下载APP 摘要 网贷之家小编根据舆情频道的相关数据,精心整理的关于<为什么很多人坚信"富贵险中求"?>的 ...

  2. python基础全部知识点整理,超级全(20万字+)

    目录 Python编程语言简介 https://www.cnblogs.com/hany-postq473111315/p/12256134.html Python环境搭建及中文编码 https:// ...

  3. init进程 && 解析Android启动脚本init.rc && 修改它使不启动android && init.rc中启动一个sh文件

    Android启动后,系统执行的第一个进程是一个名称为init 的可执行程序.提供了以下的功能:设备管理.解析启动脚本.执行基本的功能.启动各种服务.代码的路径:system/core/init,编译 ...

  4. Linux——模拟实现一个简单的shell(带重定向)

    进程的相关知识是操作系统一个重要的模块.在理解进程概念同时,还需了解如何控制进程.对于进程控制,通常分成1.进程创建  (fork函数) 2.进程等待(wait系列) 3.进程替换(exec系列) 4 ...

  5. 自己实现一个shell

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

  6. 实现一个shell程序

    实现一个自己的shell程序,这个程序有这些功能:解释执行命令,支持输入输出重定向,支持管道,后台运行 程序.当运行该程序后,它支持以下的命令格式: 1.单个命令,如:ls.2.带l到多个参数的命令, ...

  7. linux中用一个.sh文件执行多个.sh文件

      建一个文件夹存放你自己的.sh文件(用命令行操作) 先进入到: cd usr/local/sbin 目录里面 然后再新建一个文件夹: sudo mkdir myshell 建一个文件夹专门存放自己 ...

  8. linux系统编程综合练习-实现一个小型的shell程序(三)

    上节中已经实现了对普通命令的解析,包括输入重定向,输出重定向,管道,后台作业,这次就来执行已经解析好的命令,对应的函数为:execute_command(),首先对带有管道的命令进行执行: 比如:&q ...

  9. linux系统编程综合练习-实现一个小型的shell程序(一)

    之前已经花了不少篇幅学习了linux系统编程的很多知识点:文件与io.进程.信号.管道,而零散的知识点,怎么能够综合的串接起来是学习的一个很重要的目的,当然最好的方式就是用所学的知识点做一个项目了,所 ...

随机推荐

  1. ASP.NET Core 认证与授权[7]:动态授权

    ASP.NET Core 中基于策略的授权旨在分离授权与应用程序逻辑,它提供了灵活的策略定义模型,在一些权限固定的系统中,使用起来非常方便.但是,当要授权的资源无法预先确定,或需要将权限控制到每一个具 ...

  2. 学python3的书

    <Python Cookbook>3rd Edition http://python3-cookbook.readthedocs.io/zh_CN/latest/copyright.htm ...

  3. SpringBoot+Redis环境搭建

    写在正文前的絮叨: 其实这个环境的搭建是很简单的,照着官网给的说明很快就可以搭建测试出来.为什么又要写出来呢?只是为了记录.保留.分享这其中遇到的坑. 这个环境之前在架构一个简单系统时,也曾经搭建过, ...

  4. SaltStack 安装介绍 01

    一.入门指南 1.1 SALTSTACK是什么? The backbone of Salt is the remote execution engine, which creates a high-s ...

  5. hibernate第一天

    首先介绍一下javaEE开发的三层架构 Web层    也被称为表现层    它是表现层的一个设计模型:也就是大家常用的MVC开发模式 Service层   它是和需求相关的 DAO层   它只和数据 ...

  6. 第六届河南省赛 River Crossing 简单DP

    1488: River Crossing Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 83  Solved: 42 SubmitStatusWeb ...

  7. liunx

    一键安装地址:https://lnmp.org/install.html

  8. struts2 谷歌浏览器保存date类型数据时报错

    一同事发现一个bug,在chrome上保存一个表单时,后台会报错,而在firefox上则可以正常保存. 奇怪的地方在于,后端的程序是同一个,而在浏览器上查看请求header时,两个浏览器对应的字段内容 ...

  9. SpringBoot集成Redis实现缓存处理(Spring AOP实现)

    第一章 需求分析 计划在Team的开源项目里加入Redis实现缓存处理,因为业务功能已经实现了一部分,通过写Redis工具类,然后引用,改动量较大,而且不可以实现解耦合,所以想到了Spring框架的A ...

  10. javascript设计模式——命令模式

    前面的话 假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜.餐厅还可 ...