1.termio 的用法,可以通过数据结构struct termio来改变终端的各种输入输出特性,然后实现自己想要的输入输出特性,
具体demo 就不贴了,这里遗留了一个问题,就是termio 的代码调试问题,用gdb调试的时候,无法输入gdb命令
2.cmdline 例子学习,下面代码是参考dpdk 例子进行简化了的
-
#include <string.h>
-
#include <stdint.h>
-
#include <errno.h>
-
#include <termios.h>
-
-
#include <rte_eal.h>
-
#include <rte_debug.h>
-
-
#include <cmdline_rdline.h>
-
#include <cmdline_parse.h>
-
#include <cmdline_socket.h>
-
#include <cmdline_parse_ipaddr.h>
-
#include <cmdline_parse_string.h>
-
#include <cmdline.h>
-
-
struct cmd_del_result{
-
cmdline_fixed_string_t action;
-
cmdline_fixed_string_t name;
-
};
-
-
static void cmd_del_parsed(void *parsed_result,struct cmdline *cl,
-
__attribute__((unused))void *data)
-
{
-
struct cmd_del_result *res = parsed_result;
-
cmdline_printf(cl,"del %s successfully\n",res->name);
-
}
-
-
cmdline_parse_token_string_t cmd_action_del =
-
TOKEN_STRING_INITIALIZER(struct cmd_del_result,action,"del");
-
cmdline_parse_token_string_t cmd_name_del =
-
TOKEN_STRING_INITIALIZER(struct cmd_del_result,name,NULL);
-
-
-
cmdline_parse_inst_t cmd_del = {
-
.f = cmd_del_parsed,
-
.data = NULL,
-
.help_str = "del ",
-
.tokens = {
-
(void *)&cmd_action_del,
-
(void *)&cmd_name_del,
-
NULL,
-
},
-
};
-
/***************************************************************************************/
-
struct cmd_add_result { /*自定义记录解析结果的数据结构,成员没有顺序*/
-
cmdline_fixed_string_t action;
-
cmdline_fixed_string_t name;
-
cmdline_ipaddr_t ip;
-
};
-
-
static void cmd_add_parsed(void *parsed_result,struct cmdline *cl,
-
__attribute__((unused))void *data)
-
{
-
struct cmd_add_result *res = parsed_result;
-
cmdline_printf(cl,"add %s successfully\n",res->name);
-
}
-
-
/*初始化token,根据其在记录结果的数据结构中的偏移,对结果数据结构成员进行赋值,
-
根据token的类型不一样,进行不一样的初始化
-
就是有一个tokens ,他的第一个token是add ,就可以找到cmd_add 这个命令句柄,从而调用相关的函数等*/
-
cmdline_parse_token_string_t cmd_action_add =
-
TOKEN_STRING_INITIALIZER(struct cmd_add_result,action,"add"); /*字符串 add ,表示这个成员只能是add,就是tokens的第一
-
个字段,如果想允许多个字段,用“#”隔开即可*/
-
cmdline_parse_token_string_t cmd_name_add =
-
TOKEN_STRING_INITIALIZER(struct cmd_add_result,name,NULL); /*NUL ,表示这个成员是通配的,都可以*/
-
cmdline_parse_token_ipaddr_t cmd_ip =
-
TOKEN_IPADDR_INITIALIZER(struct cmd_add_result,ip); /*ip只有两种,一种是ipv4,一种是ipv6,定死了,如果输入的ip 不符
-
合ipv4或者ipv6的格式,就会显示bad arguments*/
-
-
cmdline_parse_inst_t cmd_add = {
-
.f = cmd_add_parsed, /*用户自定义的解析后的回调处理函数,*/
-
.data = NULL, /*回调函数的第三个参数*/
-
.help_str = "add ", /*shift +? 显示的帮助的内容*/
-
.tokens = { /*token 代表一条命令,这个命令是有顺序的,第一个是action,第二个是name,第三个是ip,以NULL 结束*/
-
(void *)&cmd_action_add,
-
(void *)&cmd_name_add,
-
(void *)&cmd_ip,
-
NULL,
-
},
-
};
-
-
cmdline_parse_ctx_t main_ctx[] = {
-
(cmdline_parse_inst_t*)&cmd_add, /*命令实例*/
-
(cmdline_parse_inst_t*)&cmd_del, /*命令实例*/
-
NULL, /*必须以NULL 结尾*/
-
};
int main(int argc,char **argv)
{
int ret;
struct cmdline *cl;
ret = rte_eal_init(argc,argv); /*初始化eal*/
if(ret < 0)
rte_panic("Cannot init EAL\n");
/*myexample> 就是运行起来后终端前面显示的内容,主要是main_ctx这个就是命令集合,
就是这个程序定义的所有的命令集合,作为初始化cl的参数,后面的交互都是用cl 进行交互的*/
cl = cmdline_stdin_new(main_ctx,"myexample>");
if(cl == NULL)
rte_panic("Cannot create cmdline instance\n");
cmdline_interact(cl); /*ctrl+d 这个函数返回*/
cmdline_stdin_exit(cl);
return 0;
}
ps:这个代码插入功能真心不行,代码量大一点,老是卡在那里,后面这一段连插入都不行了,将就吧,代码连起来就是了
创建用户交互命令集的步骤
1).定义一个总的命令集cmdline_parse_ctx_t
2).定义记录解析结果的数据结构
3).定义解析完成后的回调函数
4).实例化每一个命令实例cmdline_parse_inst_t
5).关联起结果数据结构和命令实例中的tokens
3.目前rte_cmdline 提供了4种token类型,分别是
1).字符串类型,如上的action,name
2).数值类型
3).ip地址类型,如上的ip
4).mac地址类型
4.自定义token 类型,可参考原有的类型进行自定义
阅读(3167) | 评论(0) | 转发(0) |