【Linux】--- 制作一个简易的shell

news/2025/1/31 18:35:17/

制作一个简易的shell

  • 一、设置命令行
  • 二、获取输入的命令
    • 第一步和第二步代码细节剖析
  • 三、命令行字符串分割
    • 第三步细节剖析
  • 四、执行命令
  • 五、代码汇总及演示

想要制作一个简易的shell,过程分为四步

一、设置命令行

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<errno.h>
#define SIZE 512
#define SEP " "
#define ZERO '\0'
#define NUM 32const char *get_username(){const char *name=getenv("USER");if(name==NULL) return "None";return name;}const char *get_hostname(){const char *hostname=getenv("HOSTNAME");if(hostname==NULL) return "None";return hostname;}const char *get_cwd(){const char* cwd=getenv("PWD");if(cwd==NULL) return "None";return cwd;}                                                                                                                                         void make_commandline_and_print(){char line[SIZE];const char *username=get_username();const char *hostname=get_hostname();const char *cwd=get_cwd();snprintf(line,sizeof(line),"[%s@%s %s]> ",username,hostname,cwd);printf("%s",line);fflush(stdout);}int main()
{// 设置命令行make_commandline_and_print();return 0;
}

二、获取输入的命令

		int get_user_command(char command[],size_t n){char *s=fgets(command,n,stdin);if(s==NULL) return -1;command[strlen(command)-1]=ZERO;return strlen(command);}
int main()
{char usercommand[SIZE];int n=get_user_command(usercommand,sizeof(usercommand));return 0;	}

第一步和第二步代码细节剖析

在这里插入图片描述

三、命令行字符串分割

 void split_command(char command[],size_t n)
{// 先处理第一个Argv[0]=strtok(command,SEP);int index=1;while((Argv[index++]=strtok(NULL,SEP)));// 特意设置=,先赋值,再判断,分割之后strtok会返回NULL,// 刚好Argv的最后一个元素是NULL,判断结束
}int main()
{split_command(usercommand,sizeof(usercommand));return 0;	}

第三步细节剖析

在这里插入图片描述

四、执行命令

void Die()
{exit(1);
}void executecommand()
{pid_t id=fork();if(id<0) Die();else if(id==0){// childexecvp(Argv[0],Argv);exit(errno);}else{// father                                                                                                                             int status=0;pid_t rid=waitpid(id,&status,0);if(rid>0){// TODO}}
}int main()
{executecommand();return 0;	}

五、代码汇总及演示

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/1568212.html

相关文章

【算法】经典博弈论问题——斐波那契博弈 + Zeckendorf 定理 python

目录 斐波那契博弈&#xff08;Fibonacci Nim&#xff09;齐肯多夫&#xff08;Zeckendorf&#xff09;定理示例分析实战演练 斐波那契博弈&#xff08;Fibonacci Nim&#xff09; 先说结论&#xff1a;当初始石子数目 n 是斐波那契数时&#xff0c;先手必败&#xff1b;否则&a…

开发环境搭建-4:WSL 配置 docker 运行环境

在 WSL 环境中构建&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 基本概念说明 容器技术 利用 Linux 系统的 文件系统&#xff08;UnionFS&#xff09;、命名空间&#xff08;namespace&#xff09;、权限管理&#xff08;cgroup&#xff09;&#xff0c;虚拟出一…

【统计的思想】假设检验(二)

假设检验是根据人为设定的显著水平&#xff0c;对被测对象的总体质量特性进行统计推断的方法。 如果我们通过假设检验否定了零假设&#xff0c;只是说明在设定的显著水平下&#xff0c;零假设成立的概率比较小&#xff0c;并不是说零假设就肯定不成立。如果零假设事实上是成立…

Vue学习四—— Home主体页面

前言 在之前已经实现了登录页面&#xff0c;项目页面增删查改的操作&#xff0c;然后选择项目&#xff0c;进入Home页面&#xff0c;也就是核心主体页面。 一、实现效果图 使用elemrnt-plus的布局容器&#xff0c;将页面分为4部分&#xff0c;也可以选择自己喜欢的布局。 在侧…

无监督学习:聚类、异常检测

聚类 工作原因我对聚类特别熟悉&#xff0c;因此视频课程基本快进看完&#xff0c;不做记录 异常检测 高斯(正态)分布 多特征异常检测 将每个特征作为独立特征&#xff08;实践证明即使不完全独立也影响不大&#xff09;计算高斯分布的参数&#xff0c;然后将待预估样本代入…

LINUX部署微服务项目步骤

项目简介技术栈 主体技术&#xff1a;SpringCloud&#xff0c;SpringBoot&#xff0c;VUE2&#xff0c; 中间件&#xff1a;RabbitMQ、Redis 创建用户 在linux服务器home下创建用户qshh&#xff0c;用于后续本项目需要的环境进行安装配置 #创建用户 useradd 用户名 #设置登录密…

three.js+WebGL踩坑经验合集(2):3D场景被相机裁切后,被裁切的部分依然可以被鼠标碰撞检测得到(射线检测)

three.js内置了Raycaster类实现鼠标的碰撞检测&#xff0c;用它可以实现3D物体的鼠标点击&#xff0c;移入移出&#xff0c;触屏检测一类的业务功能。 该功能虽然强大&#xff0c;但同事们普遍反映不是那么好用&#xff0c;因为它不像其它配套了可视编辑的3D引擎一样&#xff…

新月智能护甲系统CMIA--未来战场的守护者

新月智能护甲系统&#xff08;Crescent Moon Intelligent Armor System&#xff0c;简称CMIA&#xff09; 新月智能护甲系统&#xff08;CMIA&#xff09;是新月结合了她多年的研究成果&#xff0c;开发出的一款高度智能化的个人防护装备。这款护甲集成了先进的环境监测、生命…