簡(jiǎn)單命令行框架
概述
實(shí)現(xiàn)一個(gè)簡(jiǎn)單的命令行功能 輸入命令 然后分解命令 分解的命令填寫到
order_s中order_s作為近似全局變量講命令和命令對(duì)應(yīng)的參數(shù)傳到對(duì)應(yīng)的處理函數(shù)。
注意
具體的資源申請(qǐng)包括文件fd socket_fd 等其他系統(tǒng)資源,都需要在每個(gè)任務(wù)中申請(qǐng) 且釋放,要保證不能影響到其他命令處理的執(zhí)行
demo
/****************************************
*author cat_with_apple/LoveM *
*time 2016/8/9 *
*version version1 *
* *
****************************************/
#include <stdio.h>
#include <string.h>
typedef enum order_table_enum{TFTP_PUT=0,TFTP_GET,TFTP_LIST,TFTP_HELP,TFTP_QUIT,WRONG}order_table_enum_t;// number table
char *order_table_string[]={"put","get","list","help","quit",NULL};
typedef struct order_s {
char buff[1024];//整個(gè)命令
int table[10];//每個(gè)參數(shù)的下標(biāo)號(hào)碼
enum order_table_enum order_n;//命令編號(hào)
}ORDER_S;
order_table_enum_t get_order(ORDER_S*order_s);
void process(ORDER_S*order_s);
void put_process(const ORDER_S*order_s);
void get_process(const ORDER_S*order_s);
void list_process(const ORDER_S*order_s);
void help_process(void);
void quit_process(const ORDER_S*order_s);
void wrong_processs(const ORDER_S*order_s);
int main(int argc, const char *argv[])
{
ORDER_S order_s;
while(1)
{
get_order(&order_s);
process(&order_s);
}
return 0;
}
//填充填充order_s結(jié)構(gòu)體
order_table_enum_t get_order(ORDER_S*order_s)
{
char *p1,*p2;
printf("<zhaohe>#:");
fgets(order_s->buff,sizeof(order_s->buff),stdin);
order_s->buff[strlen(order_s->buff)-1]='\0';
//strtok 分解字符串 填寫order_s->table[]
int i=1;
p1=strtok(order_s->buff," ");
order_s->table[0]=0;
while( (p2=strtok(NULL," ")) != NULL)
{
order_s->table[i]=p2-p1;
i++;
}
//填寫結(jié)構(gòu)體的order_s->order_n
for (int j = 0; order_table_string[j]!=NULL; ++j)
{
if (strcmp(order_table_string[j],&order_s->buff[0])==0)
{
order_s->order_n=(order_table_enum_t)j; //填寫對(duì)應(yīng)的指令編號(hào)
break;
}
else if(order_table_string[j+1]==NULL)
{
order_s->order_n=(order_table_enum_t)(j+1);//如果所有命令都不匹配填寫WRONG
}
}
// printf("調(diào)試信息:命令是%s%lu\n", order_s->buff,sizeof(order_s->buff));
return order_s->order_n;
}
void process(ORDER_S*order_s)
{
switch(order_s->order_n)
{
case TFTP_PUT: put_process(order_s); break;
case TFTP_GET: get_process(order_s);break;
case TFTP_LIST: list_process(order_s); break;
case TFTP_HELP: help_process(); break;
case TFTP_QUIT: quit_process(order_s);break;
case WRONG: wrong_processs(order_s); break;
default:printf("switch wrong :遇到未知值\n"); break;
}
}
void put_process(const ORDER_S*order_s)
{
printf("put_process........\n");
return;
}
void get_process(const ORDER_S*order_s)
{
printf("get_process........\n");
return;
}
void list_process(const ORDER_S*order_s)
{
printf("list_process........\n");
return;
}
void quit_process(const ORDER_S*order_s)
{
printf("quit_process.......\n");
return;
}
void help_process(void)
{
printf("****************************************\n");
printf("*put <file name> *\n");
printf("*get <file name> *\n");
printf("*list <dir name> *\n");
printf("*quit *\n");
printf("****************************************\n");
return;
}
void wrong_processs(const ORDER_S*order_s)
{
printf("wrong_process.......\n");
return;
}