| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 从头实现Linux指令(一)实现自己的shell -> 正文阅读 |
|
[系统运维]从头实现Linux指令(一)实现自己的shell |
本文从零实现Linux指令系列文章,其他系列文章: 从头实现Linux指令(零)序言 文章目录shell概述熟悉linux的人应该都对shell有一个感性的认识,大概知道它是什么~我们还可以用一些更加精确的语言给它一个定义:命令行解释器( CLI) 或shell是代表其用户运行其他程序的程序。shell 反复打印提示例如 本项目希望能够实现一个迷你的shell,功能也许不强大,但应该具有基本的shell功能,例如ls, cd, pwd, path, 并发执行以及重定向等功能。本文首先介绍各模块的实现,最后说明如何运行并调试本项目。
开始使用 Shell 项目如果有厉害的大手子想直接审查一下笔者写的代码,可以直接访问github:https://github.com/SFUMECJF/linux-command 0 练手任务斐波那契数列大家都知道是什么,不过我们这里使用c语言中的fork() / wait()以递归方式编写。每个子进程将其结果返回给父进程,父进程一直等到子进程完成。那么通过这个练习要掌握父子进程通信的方式。
那么用进程怎么办呢?
实现结果:
1 shell 骨架本节练习系统调用,strtok、strcmp和execv,完成的目标是解析输入的指令以及实现内部指令。 1.1 REPL任何 shell 的核心都是 REPL,即read-evaluate-print loop。这是一个重复执行以下三个动作的循环:
本项目在行首循环打印 1.2 内部命令
1.3 外部命令如果给出的命令不是三个内置命令之一,则应将其视为外部可执行程序。 对于这些外部命令,使用 fork-and-exec 方法执行程序。每一个外部指令,都利用系统调用execv()调用一个子进程来执行。这里execv如何能够找到外部可执行程序呢,要靠我们上面维护的路径二维数组。 对于父进程:父进程应该使用wait()或waitpid()等待子进程。 1.4 读入shell脚本文件除了手动输入命令之外,还需要能够处理文件中的大量脚本。这里练习的文件操作,打开文件,读取一行,注意这里不是从标准输入读取,而是从文件中读取。 1.5 重定向很多时候,shell 用户更喜欢将程序的输出发送到文件而不是屏幕。shell支持使用 > 以及 < 进行输入和输出的重定向。这里使用open()以及dup1和dup2完成重定向到文件的功能。 1.6 并发执行命令
1.7 测试与运行运行: 1.8 收获与想法很久之前我做robomaster,学习了CMake以及c++调用Open CV库的基本操作。但当我去字节实习面试的时候,只记得面试官很诧异地问我:啊, |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 1:55:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |