【Linux】模拟实现一个简单的minishell


目录

从显示屏获取输入字符流

分割字符串 取出命令名称及选项

去除输入时多按的那个换行符

创建子进程,实现程序替换

如果替换失败,进程终止exit

查看子进程情况

实现echo $?功能

实现cd

最终代码


基本思路 让父进程创建一个子进程,由这个子进程进行程序替换。父进程要对这个进程进行追踪、回收。具体实现模块如下:


从显示屏获取输入字符流

 char* s=fgets(buffer,sizeof (buffer)-1,stdin);assert(s!=NULL);buffer[strlen (buffer)-1]=0;(void*)s;

分割字符串 取出命令名称及选项

//切割字符串myargv[0]=strtok(buffer," ");int i=0;if(myargv[0] != NULL && strcmp(myargv[0], "ls") == 0){myargv[++i] = (char*)"--color=auto";}while(myargv[i]!=NULL){myargv[++i]=strtok(NULL," ");}

创建子进程,实现程序替换

pid_t id =fork();if(id==0){//子进程//程序替换execvp(myargv[0],myargv); //如果走到这里表示替换失败exit(1);}

查看子进程情况

//父进程int status=0;pid_t ret= waitpid(id,&status,0);assert(ret > 0);(void)ret;quitcode=(status>>8)&0XFF;quitsignal= (status & 0x7F);

实现echo $?功能

 //实现echo $?功能if(myargv[0]!=NULL&&myargv[1]!=NULL&&strcmp(myargv[0],"echo")==0){if(strcmp(myargv[1],"$?")==0){//输出上一个进程的退出码printf("退出码为:%d\n",quitcode);}else{printf("%s\n",myargv[1]);}continue;}

实现cd

 //实现cd功能if(myargv[0] != NULL &&strcmp(myargv[0],"cd")==0){if(myargv[1]!=NULL){chdir(myargv[1]);}continue;}

最终代码

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>#define B_NUM 1024
#define ARGV_NUM 10char buffer[B_NUM];
char* myargv[ARGV_NUM];
int quitcode;
int quitsignal;int main()
{while(1){printf("【用户名@服务器 当前目录】$");fflush(stdout);char* s=fgets(buffer,sizeof (buffer)-1,stdin);assert(s!=NULL);buffer[strlen (buffer)-1]=0;(void*)s;//切割字符串myargv[0]=strtok(buffer," ");int i=0;if(myargv[0] != NULL && strcmp(myargv[0], "ls") == 0){myargv[++i] = (char*)"--color=auto";}while(myargv[i]!=NULL){myargv[++i]=strtok(NULL," ");}//实现cd功能if(myargv[0] != NULL &&strcmp(myargv[0],"cd")==0){if(myargv[1]!=NULL){chdir(myargv[1]);}continue;}//实现echo $?功能if(myargv[0]!=NULL&&myargv[1]!=NULL&&strcmp(myargv[0],"echo")==0){if(strcmp(myargv[1],"$?")==0){//输出上一个进程的退出码printf("退出码为:%d\n",quitcode);}else{printf("%s\n",myargv[1]);}continue;}pid_t id =fork();if(id==0){//子进程//程序替换execvp(myargv[0],myargv); //如果走到这里表示替换失败exit(1);}//父进程int status=0;pid_t ret= waitpid(id,&status,0);assert(ret > 0);(void)ret;quitcode=(status>>8)&0XFF;quitsignal= (status & 0x7F);}return 0;
}

最后

加油

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/248614.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fullcalendar案例

fullcalendar案例 <script srchttps://cdn.jsdelivr.net/npm/fullcalendar6.1.10/index.global.min.js></script><script srchttps://code.jquery.com/jquery-3.6.0.min.js></script> <!-- 引入 jQuery CDN --><script>document.addEventL…

python爬虫-多线程-数据库——微博用户

数据库database的包: Python操作Mysql数据库-CSDN博客 效果: 控制台输出: 数据库记录: 全部代码: import json import os import threading import tracebackimport requests import urllib.request from utils import make_headers, base64_encode_img, url_img_cv2i…

华为VRP系统简介

因为现在国内主流是华为、华三、锐捷的设备趋势&#xff0c;然后考的证书也是相关的&#xff0c;对于华为设备的一个了解也是需要的。 一、VRP概述 华为的VRP(通用路由平台)是华为公司数据通信产品的通用操作系统平台&#xff0c;作为华为公司从低端到核心的全系列路由器、以太…

深度学习之卷积神经网络

前言 如果我们采用多层BP神经网络去训练1000x1000像素的图像&#xff0c;有1百万个隐层神经元&#xff0c;那么他们全连接的话&#xff0c;就有 1 0 12 10^{12} 1012个连接&#xff0c;也就是 1 0 12 10^{12} 1012个权值参数。这训练量是很惊人的.卷积神经网络使用权值共享网络…

Excel得到JSON串

很多时候业务都需要做一种从Excel读取或者导入数据的功能&#xff0c;这在cs程序比较简单&#xff0c;在BS程序上如果封装不好的话那么写起来还是很费劲的&#xff0c;这次封装Excel读取操作。 先看使用 对&#xff0c;你没有看错&#xff0c;就是这么简单。 封装 基础设计…

远程连接服务器:Ping通但SSH连接失败的解决办法

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言常见问题影响SSH的因素本地影响因素防火墙设置网络配置文件 远程主机影响因素放行…

Redis内存设置

通过redis-cli进入Redis命令行 redis权限认证命令&#xff1a;auth 查看redis内存使用情况的命令&#xff1a;info memory 查看最大内存命令&#xff1a;config get maxmemory 设置最大内存命令&#xff1a;config set maxmemory 也可以通过redis.conf配置文件修改最大内存…

搭建幻兽帕鲁需要什么样的服务器

作为一个开放世界生存制造类游戏《幻兽帕鲁》收获了空前绝后的热度&#xff0c;玩家们在游戏中通过在地图上捕捉收集到的“帕鲁”进行训练&#xff0c;合理利用他们的能力进行战斗&#xff0c;建立自己的家园、开辟新的世界、解锁新的冒险情节&#xff0c;获取更多游戏信息增加…

blender关于几何接近(geometry proximity)节点的理解

如图&#xff0c;可以见到&#xff0c;我输入了一个立方体&#xff0c;一个圆锥体&#xff0c;为了便于区分 &#xff0c;将原生的立方体与圆锥转为了曲线&#xff0c;而进行了几何接近处理的网格不进行此转换。 几何接近的输入端&#xff0c;分为target&#xff08;目标&…

Cache Lab:Part A【模拟出使用LRU策略的高速缓存存储器组织结构】

目录 任务描述 知识回顾 实验内容 测试结果 Cache Lab 对应《CS:APP》6.3节至第六章结束的内容。 任务描述 Your job for Part A is to fill in the csim.c file so that it takes the same command line arguments and produces the identical output as the reference …

2024年最新 MySQL的下载、安装、启动与停止

一、MySQL的下载 MySQL最常用的2个版本&#xff1a; 社区版&#xff1a;免费开源&#xff0c;自由下载&#xff0c;不提供官方技术支持&#xff0c;大多数普通用户选择这个即可。企业版&#xff1a;需要付费&#xff0c;不能在线下载&#xff0c;可以使用30天&#xff0c;提供…

Java学习笔记(十一)——常用类

一、包装类 &#xff08;一&#xff09;包装类和基本数据类型的转换 ​编辑 &#xff08;二&#xff09;包装类型和String类型的相互转换 &#xff08;三&#xff09;Integer类和Character类的常用方法 二、String &#xff08;一&#xff09;创建String对象的两种方式 …

Jenkins(三):自动化部署SpringBoot项目

前言 在软件开发过程中&#xff0c;自动化部署已经成为不可或缺的一环。Jenkins是一个广泛使用的开源自动化部署工具&#xff0c;它提供了强大的功能和灵活的配置选项&#xff0c;可以帮助开发团队实现高效的持续集成和持续部署。本文将详细介绍如何使用Jenkins自动化部署Spri…

Windows系统本地安装Wnmp服务并结合内网穿透公网远程访问

目录 前言 1.Wnmp下载安装 2.Wnmp设置 3.安装cpolar内网穿透 3.1 注册账号 3.2 下载cpolar客户端 3.3 登录cpolar web ui管理界面 3.4 创建公网地址 4.固定公网地址访问 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Windows…

探索数字经济:从基础到前沿的奇妙旅程

新一轮技术革命方兴未艾&#xff0c;特别是以人工智能、大数据、物联网等为代表的数字技术革命&#xff0c;催生了一系列新技术、新产业、新模式&#xff0c;深刻改变着世界经济面貌。数字经济已成为重组全球要素资源、重塑全球经济结构、改变全球竞争格局的关键力量。预估到20…

第5章 python深度学习——波斯美女

第5章 深度学习用于计算机视觉 本章包括以下内容&#xff1a; 理解卷积神经网络&#xff08;convnet&#xff09; 使用数据增强来降低过拟合 使用预训练的卷积神经网络进行特征提取 微调预训练的卷积神经网络 将卷积神经网络学到的内容及其如何做出分类决策可视化 本章将…

wordcloud库和jieba库的使用

文章目录 wordcloud库的简单示范使用wordcloud库报错记录anaconda安装第三方jieba库jieba库的简单示范任务 1&#xff1a;三国演义中的常见词汇分布在“三国"这两个隶书字上&#xff0c;出现频率高的词字体大任务 2&#xff1a;三国演义中出现频率前十的人名。必须是以下这…

ES的一些名称和概念总结

概念 先看看ElasticSearch的整体架构&#xff1a; 一个 ES Index 在集群模式下&#xff0c;有多个 Node &#xff08;节点&#xff09;组成。每个节点就是 ES 的Instance (实例)。每个节点上会有多个 shard &#xff08;分片&#xff09;&#xff0c; P1 P2 是主分片, R1 R2…

伊恩·斯图尔特《改变世界的17个方程》毕达哥拉斯定理笔记

它告诉我们什么&#xff1f; 直角三角形的三个边之间有什么关系。 为什么重要&#xff1f; 它提供了几何和代数之间的重要联系&#xff0c;使我们能够根据坐标计算距离。它也催生出了三角学。 它带来了什么&#xff1f; 测绘、导航&#xff0c;以及较近代出现的狭义和广义相对论…

无法解析的外部符号_WinMain@16

错误示例&#xff1a; #include <Windows.h>int main() {return 0; } 正确示例1&#xff1a; 控制台&#xff1a; #include <Windows.h>int main() {return 0; } 正确示例2&#xff1a; Windows窗口 #include <Windows.h>int WINAPI wWinMain(HINSTANC…