自主实现一个minishell程序

2023-05-16

此时没有重定向功能
我们知道对于Linux,shell就是个命令行解释器,当我们输入相关的命令,会去执行相关的操作。

比如当我们输入ls -a -l命令,shell就会打印出当前目录的内容,这是如何实现的?shell自己就是一个进程,当我们输入ls之类的命令,它会通过fork,exec函数去创建一个新的子进程去执行相关操作。因此我们也可以利用这个来实现一个简单的shell。

当然,这个shell足够简单,并不能像Linux内置的shell那么强大支持各种操作,报错,等等。

#include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 #include <string.h>
  5 int main(){
  6 //1.等待用户输入
  7     while(1){ 
  8         printf("[fw@localhost$ root] ");
  9         char str[1024];//设置最大的长度
 10         if(scanf("%[^\n]%*c",str)!=1){
 11             getchar();
 12             continue;
 13         } 
 14     //2.解析输入数据,用数组存储起来,
 15         char* s[32]={0};
 16         char* start = str;
 17         char* end = str; 
 18         int i = 0;
 19         while(*end !='\0'){                                                 
 20                 if(*end!=' '){ 
 21                     s[i++] = end;
 22                 while(*end!=' '&&*end!='\0'){
 23                     end++;
 24                 }
 25             }
 26             *end = '\0';
             end++;
 28         }
 29         s[i]= NULL;
 30         if(strcmp(s[0],"cd") == 0){
 31             //   int chdir(const char *path);
 32             chdir(s[1]);
 33             continue;
 34         }
 35 //3.创建子进程,在子进程中进行数据读
 36 //4.等待子进程退出
 37         pid_t pid;
 38         pid = fork();
 39         if(pid<0){
 40             continue;
 41         }
 42         else if(pid == 0){//创建一个子进程执行逻辑
 43           //    int execvp(const char *file, char *const argv[]);
 44              if(execvp(s[0],s)<0){
 45                  perror("");
 46                  }
 47              exit(0);
 48         }
 49         wait(NULL);//父进程等待子进程的推出,防止产生僵尸进程
 50     }
 51     return 0;   
 52 }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自主实现一个minishell程序 的相关文章

  • FPGA基于XDMA实现PCIE X8的HDMI视频采集 提供工程源码和QT上位机程序和技术支持

    目录 1 前言2 我已有的PCIE方案3 PCIE理论4 总体设计思路和方案5 vivado工程详解6 驱动安装7 QT上位机软件8 上板调试验证9 福利 xff1a 工程代码的获取 1 前言 PCIE xff08 PCI Express
  • Zynq实现SDI视频解码PCIE传输 提供工程源码和QT上位机源码加技术支持

    目录 1 前言2 我已有的SDI编解码方案3 我已有的PCIE方案4 基于zynq架构的PCIE5 总体设计思路和方案SDI摄像头Gv8601a单端转差GTX解串SDI解码VGA时序恢复YUV转RGB图像缓存PCIE发送通路SDI同步输出通
  • FPGA实现MPEG2视频压缩PCIe传输 提供软硬件工程源码和技术支持

    目录 1 前言2 MPEG2视频压缩实现3 我已有的FPGA图像视频编解码方案4 我已有的PCIE方案5 MPEG2视频压缩PCIE传输设计方案FPGA硬件设计软件设计 6 Vivado工程详解7 Linux下的XDMA驱动安装8 上板调试
  • FPGA基于GS2971/GS2972实现SDI视频收发 提供工程源码和技术支持

    目录 1 前言2 我目前已有的SDI编解码方案3 GS2971 GS2972芯片解读GS2971解读GS2972解读 4 详细设计方案5 vivado工程1解读硬件逻辑工程软件SDK工程 6 vivado工程2解读硬件逻辑工程软件SDK工程
  • STM32 CubeMX生成DAC+DMA+TIM生成正弦波

    1 首先配置好系统时钟 2 打开DAC 3 配置DMA xff0c 在DAC中的 34 DMA Setting 34 选项卡中添加DMA DMA模式选择循环模式 4 配置定时器 在第二步中选择的是TIM6 在第一步中设置的定时器频率是36M
  • allegro 使用汇总

    1 如何在allegro中取消花焊盘 十字焊盘 set up gt design parameter gt shape gt edit global dynamic shape parameters gt Thermal relief co
  • 操作系统的分页和分段式管理

    计算存储的层次结构 xff1a 当前技术没有能够提供这样的存储器 xff0c 因此大部分的计算机都有一个存储器层次结构 xff0c 即少量的非常快速 昂贵 易变的高速缓存 cache xff1b 若干兆字节的中等速度 中等价格 易变的主存储
  • 三极管什么时候工作在饱和区

    http www dzsc com dzbbs 20070115 200765213434343495 html 三极管什么时候工作在饱和区 xff1f 以前我以为Ib大的时候就在饱和区 现在看了书 xff0c 看来应该是两个PN结都正偏的
  • shell脚本基础

    摘自 xff1a 一篇教会你写90 的shell脚本 1 注释 xff1a 单行注释 xff1a 多行注释 xff1a 注意第一种注释方法的 34 后面有一个空格 xff09 39 多行注释内容 39 lt lt block 多行注释内容
  • RT-thread 中CAN总线的应用

    准备 xff1a RT thread Studio 2 2 5 CubeMX 6 6 1 rt thread驱动包 4 0 3 1 新建项目 2 打开CubeMX Settings xff0c 设置CAN 找到CAN1 xff0c 并勾选激
  • Rt-thread的CAN应用2

    1 rtt中使能CAN1 2 CubeMX生成部分代码 xff0c 完成下面操作然后生成MDK ARM项目文件 3 将CubeMX生成的 HAL CAN MspInit 函数 粘贴到drv can c中 并在rt hw can init 函
  • STM32的IIC接口输入输出定义

    IO方向设置 PC11 端口 define SDA IN GPIOC gt CRH amp 61 0XFFFF0FFF GPIOC gt CRH 61 8 lt lt 12 define SDA OUT GPIOC gt CRH amp 6
  • 从头开始用树莓派做一个NAS【最新超详细教程】

    一 概述 众所周知在办公的时候两台电脑之间经常倒数据资料非常麻烦 xff0c 而NAS可以很好的解决这个问题 树莓派搭建NAS方法有很多 xff0c 我们之前也拍过直接用Samba FTP这些来实现NAS功能 xff0c 但是这些需要你会在
  • 串口发送通信---UART发送---STM32F4实现

    串口发送程序配置过程 xff08 HAL库 xff09 初始化串口相关参数 xff0c 使能串口 HAL StatusTypeDef span class token function HAL UART Init span span cla
  • 基于UDP的文件传输VS编程

    要求 xff1a 实现基于UDP的文件传输 xff0c 客户端发送文件 xff0c 服务端接受文件 服务端实现 xff1a include 34 stdafx h 34 include 34 iostream 34 include 34 a
  • 成功解决VSCODE运行C++的报错问题g++

    成功解决VSCODE运行C 43 43 的报错问题g 43 43 解决方案调试 很久写C 43 43 了 xff0c 直接打开C 43 43 写代码测试一下 xff0c 报错 xff0c 真一脸懵逼 捯饬很久 xff0c 解决了问题 解决方
  • linux下的环境变量

    环境变量 环境变量 xff0c 是指在操作系统中用来指定操作系统运行环境的一些参数 通常具备以下特征 xff1a 字符串 本质 有统一的格式 xff1a 名 61 值 值 值用来描述进程环境信息 存储形式 xff1a 与命令行参数类似 ch
  • 【004 关键字】extern “C“的作用是什么?

    一 extern 34 C 34 的作用 extern 34 C 34 关键字常用于C 43 43 和C混合编程中 xff0c 用于指定函数或变量采用C语言的命名和调用约定 加上extern 34 C 34 后 xff0c 会指示编译器这部
  • C++模板编程--学习C++类库的编程基础

    目录 一 函数模板二 类模板三 实现C 43 43 STL向量容器vector代码四 理解容器空间配置器allocator的重要性 一 函数模板 1 模板的意义 xff1a 对类型也可以进行参数化了 2 函数模板 lt 61 是不进行编译的

随机推荐

  • cmake 学习使用笔记(二)库的生成与使用

    学习使用cmake 生成及使用库 xff0c 使用cmake 生成 lib 静态库 及动态库 xff08 dll xff09 及linux 下使用的静态库 a 和 动态库 xff08 so 也称为共享库 xff09 目录 使用工具 生成库
  • cmake 学习使用笔记(五)手动编译

    目录 编译cmake 项目 构建 方式一 xff1a 可执行文件生成的在当前目录 方式二 xff1a 可执行文件生成只制定目录 记录一下手动编译 cmake 项目 编译cmake 项目 项目结构 注意 xff1a 必须要有一个 CMakeL
  • 四旋翼无人机学习第5节--STM32最小系统外围电路分析

    文章目录 1 芯片手册分析2 stm32的外部晶振手册分析2 stm32的外部上电复位手册分析3 电源放置方法4 GND放置方法5 其他元器件放置方法6 网络放置方法7 快捷键分享8 原理图绘制成果分享 快速使用芯片的最好的方式 xff0c
  • 现代C++单文件库(header only)

    nlohmann json https github com nlohmann json easyloggingpp https github com amrayn easyloggingpp
  • 一、ROS创建工作空间

    一 ROS创建工作空间 1 什么是工作空间2 创建工作空间3 编译工作空间4 创建功能包5 编译功能包 xff08 重新编译工作空间 xff09 6 设置环境变量7 运行节点 1 什么是工作空间 工作空间 xff08 workspace x
  • 二、ROS集成开发环境

    二 ROS集成开发环境 1 安装terminator2 安装VScode3 在VScode中使用ROS3 1 创建工作空间3 2 启动VScode3 3 配置VScode3 4 创建功能包3 5 编写C 43 43 文件3 6 配置CMak
  • 十一、Ubuntu18.04下VSCode配置C/C++编译环境

    十一 Ubuntu18 04下VSCode配置C C 43 43 编译环境 1 安装VSCode2 安装插件3 创建工程4 总结 1 安装VSCode 这一步就不谈了 2 安装插件 编译一些简单的cpp文件 xff0c 下面几个插件就够用了
  • 十五、Typora官方主题 + 自定义主题

    十五 Typora官方主题 43 自定义主题 1 下载官方主题2 在官方主题的基础上自定义 1 下载官方主题 首先去Typora官网下载自己喜欢的主题 xff1a 官方主题下载 例如我这里选择 Vue 我们只用到里面的两个主题文件vue c
  • linux---进程控制

    进程控制 fork函数 创建一个子进程 pid t fork void 失败返回 1 xff1b 成功返回 xff1a 父进程返回子进程的ID 非负 子进程返回 0 pid t vfork void 同样时创建一个子进程 xff0c 但是他
  • 十六、windows11下VSCode配置C/C++编译环境

    十六 windows11下VSCode配置C C 43 43 编译环境 1 安装VSCode2 中文插件3 MinGW编译器下载和配置4 VSCode配置c c 43 43 编译环境5 测试是否配置成功6 使用万能头文件 include l
  • 十七、WSL2的安装与使用(Win11)

    十七 WSL2的安装与使用 xff08 Win11 xff09 1 准备工作1 1 开启主板 BIOS 虚拟化1 2 检查是否成功开启虚拟化1 3 开启开发者模式1 4 开启所需Windows功能1 5 下载 WSL 内核升级包 2 开始安
  • 十八、Ubuntu20.04 + VSCode + Opencv3.4.16 配置 + WSL2 可视化

    十八 Ubuntu20 04 43 VSCode 43 Opencv3 4 16 配置 43 WSL2 可视化 1 下载和解压 OpenCV3 4 162 使用 cmake 编译 OpenCV3 配置环境4 代码测试4 1 录制视频4 2
  • IntelRealSense 更新D435固件时,运行rs-fw-update -l后报错:找不到命令

    环境 xff1a Ubantu18 04 摄像头 xff1a IntelRealsense D435 首先确定电脑里已经成功安装了 librealsense 想要更新下D435的固件 xff0c 但是运行rs fw update l后报错
  • Linux _ Shell编程 — 变量

    一 shell脚本的基础知识 1 shell脚本的本质 语言的分类有 xff1a 编译性语言 C语言 C 43 43 语言 JAVA PHP Python等 xff0c 不同编译器编译的执行文件不同 xff0c 运行的平台也不尽相同 解释性
  • USART _ 两串口同时使用,冲突问题

    1 使用外设情况 xff1a 1 初始化了两个串口 xff1a 串口1以及串口2 xff0c 使用串口2DMA发送数据 xff0c 接收中断 接收数据 xff1b 使用串口1发送函数发送数据 xff0c 接收中断接收数据 xff1b 2 问
  • C语言 _ MakeFile(一)

    一 Make简介 工程管理器 xff0c 顾名思义 xff0c 是指管理较多的文件 Make工程管理器也就是个 自动编译管理器 xff0c 这里的 34 自动 34 是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量 xff0c
  • C语言_网络编程_SQLite3数据库项目 _ 在线词典

    一 项目分析 1 在线词典一般的饿运行过程 xff1a 例如 服务器端将用户信息和历史记录保存在数据库中 客户端输入用户和密码 xff0c 服务器端在数据库中查找 匹配 xff0c 返回结果 xff1b 2 项目的流程 定义数据库中表的结构
  • ARM体系结构与接口技术 —— ARM基础 及 指令

    一 ARM基础 1 ARM公司讲解 成立于1990年11月 前生为Acorn计算机公司 xff1b 主要设计ARM系列RISC处理器内核 xff1b 授权ARM内核给生产和销售半导体的合作伙伴 xff1b ARM公司不生产芯片 xff1b
  • 嵌入式基础_STM32F103C8T6从零开始建立一个项目(库函数)

    第一步 xff1a stm32f10x标准库下载 xff08 STSW STM32054 xff09 https www st com content st com zh products microcontrollers micropro
  • 自主实现一个minishell程序

    此时没有重定向功能 我们知道对于Linux xff0c shell就是个命令行解释器 xff0c 当我们输入相关的命令 xff0c 会去执行相关的操作 比如当我们输入ls a l命令 xff0c shell就会打印出当前目录的内容 xff0