shell实现(一)设计接口和结构体

本文介绍了一个类UNIX命令解析器的设计与实现过程,包括函数库引用、宏定义、结构体设计及函数接口声明等内容。解析器使用了内存池来避免内存泄露,并实现了命令的属性压缩,以二进制位的形式记录命令的不同属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.函数库的引用


#include <sys/stat.h>//获得文件的属性的函数库
#include <sys/types.h>//提供基本的系统数据类型,如CPU时钟周期等
#include <sys/wait.h>//调用系统的阻塞等待函数
#include <stdio.h>//C语言输入输出库
#include <stdlib.h>//C语言标准库
#include <errno.h>//定义通过错误码来汇报错误资讯宏
#include <fcntl.h>//文件操作
#include <pwd.h>//提供了passwd这个用户基本信息的结构体
#include <string.h>//C语言字符串操作库
#include <unistd.h>//类UNIX操作系统POSIX的API原句

这都是类UNIX编程中常用的库,也是最基本的功能库,包括一些很好用的功能函数和宏定义还有结构体,当然也有一些不好用的,我会提供替代的方案。

2.宏定义一些常量

#define MAX_ARGS 20 //命令的参数的最大值
#define MAX_CMD 1000 //每行读入命令的最大条数
#define MAX_GRP 100  //命令的最多分组
#define BUFSIZE 1024 //数据读入缓存区的规模
#define TRUE 1        //

//利用二进制位记录一条命令的属性(状态压缩)
#define TYPE
#ifdef TYPE
#define PIPE                 1
#define BACKGROUND           2
#define IN_REDIRECT          4
#define OUT_REDIRECT         8
#define OUT_REDIRECT_APPEND 16
#endif

没有什么难度,简单的宏定义。

3.设计结构体

首先为了防止内存泄露,我采用的是内存池的方案。从池中取命令和命令组的占位,命令组只记录命令的区间,遵循STL的前开后闭习惯。因为我的字符串只利用一个读入缓存区,所以,命令中只存在指针。
大致定义如下:

struct command_info
{
    int type;//记录命令的属性,每个二进制位表示一种属性
    char* input;//记录输入重定向
    char* output;//记录输出重定向
    char* cmd;//记录命令
    char** param;//记录命令的参数
};

struct command_info cmd[MAX_CMD];//命令的内存池

struct command_group
{
    int first,last;//记录这个命令群的区间
};

struct command_group group[MAX_GRP];//命令群的内存池

4.函数接口的声明

  • 打印提示信息
  • 读取命令
  • 分析命令
  • 执行命令
    笨想一下,就应该知道是模仿linux…
//parse一族代表分析命令的函数
void parse_group ( char* );
void parse_command ( char* , int mode );
void parse_token ( char* );
//制作提示信息的函数
void make_prompt( char* );
//读取命令的函数
void read_command( char* , char* );
//执行命令的函数
void run_shell(void);
void run_command ( int,int);
//管理内存池的函数
void clear_cmd(void);
int init_cmd(void);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值