1. 程式人生 > >shell實現(一)設計介面和結構體

shell實現(一)設計介面和結構體

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);