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

【Linux】轻量级命令解释器minishell

Minishell

一、项目背景

在linux操作系统中,用户对操作系统进行的一系列操作都不能直接操作内核,而是通过shell间接对内核进行操作。

Shell 是操作系统中的一种程序,它为用户提供了一种与操作系统内核和计算机硬件进行交互的界面。用户可以通过 Shell 输入命令来执行各种任务,如文件管理、程序执行和系统配置等。

此次目标是自己编写一个minishell程序,可以完成shell的的基础功能。                    

二、项目实现

  1. 完成minishell界面设计
  2. 从终端接收用户输入的命令
  3. 调用函数实现用户命令

三、代码

terminal.c

#include"terminal.h"
#include <unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>
#include <sys/wait.h>void show_usr_term_line()
{char buff[512] = {0};char path[128] = {0};getcwd(path,sizeof(path)); //获取当前工作目录的绝对路径sprintf(buff,"linux@Ubuntu:%s$ ",path);printf("%s",buff);return;
}int get_usr_cmd(char *buff,int len)//读取用户命令
{/*fgets(buff,sizeof(buff),stdin);形参是实参的拷贝,这里的buff是个指针,占8个字节*/fgets(buff,len,stdin);buff[strlen(buff) - 1] = '\0';return 0;
}int parse_usr_cmd(char * cmd_buf, char *arg[])//解析用户命令
{int i = 0;arg[i] = strtok(cmd_buf," ");while(arg[i] != NULL){i++;arg[i] = strtok(NULL," ");}return i;
}void exec_usr_cmd(char *arg[],int cmd_cnt)//执行用户命令
{pid_t pid = fork();if(pid > 0){wait(NULL);}else if (0 == pid){execvp(arg[0],arg);printf("fail exec");        }else{printf("fail fork");}
}

main.c

#include<stdio.h>
#include"terminal.h"
#include<string.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{char cmd_buff[CMD_MAX_LEN] = {0};char *arg[CMD_MAX_CNT] = {NULL};int cmd_cnt = 0;while(1){show_usr_term_line();get_usr_cmd(cmd_buff,CMD_MAX_LEN);cmd_cnt = parse_usr_cmd(cmd_buff,arg);if(!strcmp(arg[0],"exit"))//退出minishell{break;}else if (!strcmp(arg[0],"cd"))//execvp不包含cd命令{chdir(arg[1]);//更改工作路径continue;}exec_usr_cmd(arg,cmd_cnt);}return 0;
}

terminal.h

#ifndef __TERMINAL_H__
#define __TERMINAL_H__#define CMD_MAX_LEN 512
#define CMD_MAX_CNT 10//用户命令字段
extern void show_usr_term_line();
extern int get_usr_cmd();
extern int parse_usr_cmd(char * cmd_buf, char *arg[]);
extern void exec_usr_cmd(char *arg[],int cmd_cnt);#endif

使用makefile管理工程文件

Makefile

DST=app
SRC=main.c terminal.c
CC=gcc$(DST):$(SRC)$(CC) $^ -o $@clean:rm $(DST)

相关文章:

  • 在线查看网站免费工具 wps, dps, et, ett, wpt 文件格式
  • Java 性能优化:从硬件到软件的全方位思考
  • JavaScript性能优化实战(1):性能优化基础与性能分析工具
  • KRaft面试思路引导
  • 【JavaEE】计算机的工作原理
  • [SpringMVC]请求响应参数传递
  • 系统架构师2025年论文《论基于UML的需求分析》
  • SF6气体回收装置参数特点分享
  • 内网穿透快解析免费开放硬件集成SDK
  • STM32——新建工程并使用寄存器以及库函数进行点灯
  • 目标检测中的损失函数(二) | BIoU RIoU α-IoU
  • redis队列 和 秒杀应用
  • 高保真动态项目管理图表集
  • (七)深入了解AVFoundation-采集:采集系统架构与 AVCaptureSession 全面梳理
  • 【解决方法】关于解决QGC地面站4.4.3中文BUG,无法标注航点的问题
  • 【大语言模型DeepSeek+ChatGPT+python】最新AI-Python机器学习与深度学习技术在植被参数反演中的核心技术应用
  • 效率就是竞争力
  • 算法题(130):激光炸弹
  • 每日一题(小白)回溯篇7
  • Vue中如何优雅地阻止特定标签的移除并恢复其原始位置
  • 为青少年写新中国成立的故事,刘统遗著《火种》出版
  • 南京信息工程大学商学院讲师李玮玮逝世,终年45岁
  • 今年一季度,上海对东盟进出口总值同比增长7.1%
  • 对话地铁读书人|来自法学教授的科普:读书日也是版权日
  • 2025年世界互联网大会亚太峰会数字金融论坛举行
  • 鲁比奥在法国只字不提关税,美国威胁下欧盟勉力维持统一战线