发布时间:2026/9/2 16:20:51
Linux C项目 | 迷你命令行解释器 (1) 简介这是一个纯C实现的简单Linux Shell用于巩固Linux应用编程学习适合学到线程阶段的巩固练习。首先做一个项目得知道这个项目为什么存在命令行解释器 Shell 功能是用于解析用户命令然后调用操作系统的程序就像是用户和操作系统之间的 翻译官调度员。Shell是指命令行解释器这一大类如Bash是Linux的一个具体的Shell、CMD和PowerShell是Windows的具体的Shell。常打开的终端是给Shell提供输入输出界面的负责接收键盘的输入和显示程序的输出终端 → (提供输入输出窗口) → Shell (解析命令、调用程序) → 操作系统内核这个项目只实现了一个最小可用的Shell1.交互式命令循环显示命令提示符 持续读取输入、解析、执行直到用户退出2.命令输入读取可以从标准输入读取单行命令使用手写的动态缓冲区3.命令解析将输入按空白字符拆分成命令和参数生成execvp可用的参数数组4.内置命令支持cd、help、exit三个内置命令5.外部命令执行非内置命令创建子进程调用执行程序父进程等待子进程命令结束6.错误处理cd缺少参数、fork失败等失败信息都要能够输出错误信息保持shell主循环能够继续设计模块一实现read_line( ) 读取用户的输入设计函数read_line( ) → 让用户输入读取用户的输入 → 放到内存 → 返回内存地址1.让用户输入并获取内容有这些函数可以实现函数用途数据源getchar (标准IO)从标准流中读取一个字符stdin标准输入流fgetc (标准IO)从指定流中读取一个字符FILE *fgets (标准IO)从指定流中读取一行文本FILE *getline (POSIX 标准IO)动态读取指定流一行文本FILE *read (文件IO)从底层读取数据文件描述符 fdscanf (标准IO)按格式读取标准流stdinfscanf (标准IO)从指定流中按格式读取FILE *先说结论本项目选择的是 getchar实现因为这个需求只是简单的文本处理不需要操作底层细节因此不用文件IO那为什么不选择其他标准IO因为已知是从键盘标准流读取数据的直接使用getchar读取标准流即可更简洁不需要再去指定流那为什么是一个字符一个字符读取因为本项目主要是为了学习巩固底层细节控制什么时候结束、自己malloc以及realloc所以选择getchar实现那为什么不用scanf因为scanf遇到格式化解析 %s 的时候遇到空格会停止不适合用来输入命令该需求完全可以使用getline快速实现读取命令行系统会帮你读取整行并且分配好内存。使用getchar其实就是把getline背后要做的事情实现了一遍。那读取一行不是也可以使用fgets吗是的不过使用fgets的话需要提前准备固定大小的数组可能会遇到超过容量的问题getline可以动态扩容2.读取的字符存在哪里因为不知道用户会输入多长的命令所以不应该把buffer写死应该先malloc申请一块内存存放后面如果出现了超出内存越界的情况再realloc改变动态内存的大小进行动态扩容代码实现第一版核心代码#include stdio.h #include stdlib.h char *read_line(){ // 声明读函数 读取字符串需要返回一个字符串地址 因此使用char *来接收这个字符串的首地址 #define BUFFER_SIZE 1024 // 宏定义 固定配置初始缓冲区大小、每次扩容的大小 int bufsize BUFFER_SIZE; // 声明缓冲区大小变量 int c; // 用来接收用户的输入 注意getchar的返回类型是int类型 char *buffer malloc(sizeof(char) * bufsize); // 申请一块内存 用于存放字符 返回内存地址使用char *接收 int position 0; // 用来标记位置读到哪里 while(1){ c getchar(); if (c EOF){ // 数据读完了 结束 exit(EXIT_SUCCESS); } else if (c \n){ // 读到换行符 读完了 buffer[position] \0; // 将换行符换成字符串结束标志 \0 return buffer; } else{ // 读的过程 buffer[position] c; // 把读到的字符存到数组 } position; // 读完移动位置 } } int main(void){ return 0; }敲完代码进行检查发现以下问题1.没有进行malloc的检查因为malloc不保证一定成功系统内存空间可能不足2.没有进行动态扩容可能发生内存越界修改后的代码#include stdio.h #include stdlib.h char *read_line(void){ // 读取字符串需要返回一个字符串地址 因此使用char *来接收这个字符串的首地址 #define BUFFER_SIZE 1024 // 宏定义 固定配置初始缓冲区大小、每次扩容的大小 int bufsize BUFFER_SIZE; // 声明缓冲区大小变量 int c; // 用来接收用户的输入 注意getchar的返回类型是int类型 char *buffer malloc(sizeof(char) * bufsize); // 申请一块内存 用于存放字符 返回内存地址使用char *接收 int position 0; // 用来标记位置读到哪里 // malloc检查 if(!buffer){ // 如果malloc申请失败 异常退出 fputs(malloc申请内存失败\n,stderr); // 因为不需要格式化输出 这里使用fputs输出到标准错误流 exit(EXIT_FAILURE); // 异常退出 } while(1){ c getchar(); if (c EOF){ // 数据读完了 结束 exit(EXIT_SUCCESS); // 程序正常退出 } else if (c \n){ // 读到换行符 读完了 buffer[position] \0; // 将换行符换成字符串结束标志 \0 → 字符串一定要有结束标志 return buffer; } else{ // 读的过程 buffer[position] c; // 把读到的字符存到数组 } position; // 读完移动位置 // 当内存满了需要动态扩容 if(position bufsize){ bufsize BUFFER_SIZE; // 再增加1024字节 buffer realloc(buffer,bufsize); // realloc检查 if(!buffer){ fputs(realloc申请内存失败\n,stderr); exit(EXIT_FAILURE); } } } } int main(void){ return 0; }疑问1为什么 bufsize BUFFER_SIZE 这里直接增加了1024字节而不是每次增加一个字节这确实会造成一点内存空间的浪费但不是严重的浪费这是牺牲一点内存空间去换取扩容效率。因为realloc的流程是如果原来的内存后面没有足够连续的内存空间 → 找到一块更大的新内存空间 → 把旧数据复制过去 → 释放旧的内存 → 返回新的内存空间地址。如果每次增加一个字节就需要频繁的扩容浪费大量的时间降低效率模块一已设计开发完成梳理一下链路画草图辅助梳理一下链路

相关新闻

2026/9/2 16:15:51

纯Python手写CNN:从零实现卷积、池化与反向传播

简介:手写实现的二维卷积神经网络(2D CNN)Python代码,面向希望深入理解CNN底层原理的Python学习者与图像处理入门者,适合在PyCharm中运行调试。资源共2个文件,包括一个.py源码文件和一个.docx实验报告&…

2026/9/2 16:15:51

WMM2020COF地磁模型系数文件解析:从球谐展开到工程实现

简介:这份压缩包为WMM2020地磁模型的CGGM计算工具包,面向钻井、物探等需要高精度地磁参考的工程师与科研人员,用于解决2020年地磁模型系数解析、磁场分量计算及数据格式转换等问题。内含7个文件,包括3个MATLAB脚本、3个TXT数据文本…

2026/9/2 16:30:53

何设计一个高并发系统?

如何设计一个高并发系统?这是一个非常高频的面试题,面试官可以从多个角度,考查技术的广度和深度。今天这篇文章跟大家一起聊聊高并发系统设计一些关键点,希望对你会有所帮助。1 页面静态化对于高并发系统的页面功能,我…

2026/9/2 16:30:53

exe 打包、解包、修复与跨平台运行全攻略

标题我给原封不动保留了:它确实是一串看起来像“动画标题”的字符串,但今天要讲的内容和剧集没有关系。真正要解决的是 exe 相关的整套实际问题:Python 脚本怎么打包成 exe、别人给的 exe 怎么解包、exe 项目怎么改造成 DLL、国产 Linux 系统…

2026/9/2 16:30:53

小白程序员必备:收藏这份Agent开发转型指南,轻松拿高薪!

随着2026年Agent开发的兴起,后端程序员面临转型选择。文章分析指出,Agent开发并非全新领域,而是后端能力的升级,包括架构、工程、AI和数据能力的提升。 2026年,技术圈最火的非Agent莫属。无论是大厂内部传出的风向&…

2026/9/2 16:30:53

小白程序员快速入门工业大模型,解锁制造业智能化转型新机遇

工业大模型技术正从消费互联网领域向工业制造领域深度渗透,推动工业智能化转型进入新阶段。本文系统分析了工业大模型的技术特点、应用价值、实施挑战与未来趋势,包括混合架构创新、核心技术优势、行业适配特性等,并介绍了在生产制造、设备运…

2026/9/2 16:30:53

LaTeX 从零到实战:环境搭建、核心语法与项目报告排版指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/2 16:25:53

超越承重:铸铁台选型评估框架与工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/2 9:00:32

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/2 8:41:06

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/2 0:03:41

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/2 0:03:41

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

这次我们来看一个很实用的 DeepSeek 落地场景:用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务,标题写得很直白,但背后其实是一整套可以复用的技术流程:字幕解析、模型调用、批量…

2026/9/2 0:03:41

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

当你家里摆着一台天猫精灵,却总希望语音助手偶尔“不正经”一点,不用官方腔回答问题,而是张口就接几句搞笑段子,会是什么体验?我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱,而是直…

2026/9/2 1:15:22

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/2 1:15:22

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…