当前位置: 首页 > article >正文

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

制作一个简易的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 32

	const 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)
	{
		// child
  		execvp(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.kler.cn/a/525573.html

相关文章:

  • 4.用户 组
  • 代码随想录|动态规划 322. 零钱兑换 279.完全平方数 139.单词拆分
  • Java实现LFU缓存策略实战
  • 31. C语言 命令行参数
  • 剑指 Offer II 011. 0 和 1 个数相同的子数组
  • 【开源免费】基于SpringBoot+Vue.JS公交线路查询系统(JAVA毕业设计)
  • unity使用AVpro插件播放视频,打包安卓系统总是失败
  • R语言统计分析——ggplot2绘图4——刻面
  • 21.2-工程中添加FreeRTOS(掌握) 用STM32CubeMX添加FreeRTOS
  • H3CNE-31-BFD
  • WEB集群6-10天
  • 深入解析 C++17 中的 std::not_fn
  • 数据结构--差分数组(含题目)<基础入门>
  • 2025创业思路和方向有哪些?
  • 最新版仿天涯论坛系统源码带后台
  • 30组成字符串ku的最大次数-青训营刷题
  • 将点云转换为 3D 网格:Python 指南
  • 分享几个好用的Edge扩展插件
  • 自制一个入门STM32 四足机器人具体开发顺序
  • Pwn 入门核心工具和命令大全