Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229498
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 296
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-22 11:52
文章分类

全部博文(31)

文章存档

2018年(3)

2017年(11)

2016年(12)

2015年(5)

我的朋友

分类: C/C++

2016-07-28 18:33:35

1.termio 的用法,可以通过数据结构struct termio来改变终端的各种输入输出特性,然后实现自己想要的输入输出特性,
   具体demo 就不贴了,这里遗留了一个问题,就是termio 的代码调试问题,用gdb调试的时候,无法输入gdb命令
2.cmdline 例子学习,下面代码是参考dpdk 例子进行简化了的


点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdint.h>
  3. #include <errno.h>
  4. #include <termios.h>

  5. #include <rte_eal.h>
  6. #include <rte_debug.h>

  7. #include <cmdline_rdline.h>
  8. #include <cmdline_parse.h>
  9. #include <cmdline_socket.h>
  10. #include <cmdline_parse_ipaddr.h>
  11. #include <cmdline_parse_string.h>
  12. #include <cmdline.h>

  13. struct cmd_del_result{
  14.         cmdline_fixed_string_t action;
  15.         cmdline_fixed_string_t name;
  16. };

  17. static void cmd_del_parsed(void *parsed_result,struct cmdline *cl,
  18.                            __attribute__((unused))void *data)
  19. {
  20.         struct cmd_del_result *res = parsed_result;
  21.         cmdline_printf(cl,"del %s successfully\n",res->name);
  22. }

  23. cmdline_parse_token_string_t cmd_action_del =
  24. TOKEN_STRING_INITIALIZER(struct cmd_del_result,action,"del");
  25. cmdline_parse_token_string_t cmd_name_del =
  26. TOKEN_STRING_INITIALIZER(struct cmd_del_result,name,NULL);


  27. cmdline_parse_inst_t cmd_del = {
  28.         .f = cmd_del_parsed,
  29.         .data = NULL,
  30.         .help_str = "del ",
  31.         .tokens = {
  32.                 (void *)&cmd_action_del,
  33.                 (void *)&cmd_name_del,
  34.                 NULL,
  35.         },
  36. };

点击(此处)折叠或打开

  1. /***************************************************************************************/
  2. struct cmd_add_result { /*自定义记录解析结果的数据结构,成员没有顺序*/
  3.         cmdline_fixed_string_t action;
  4.         cmdline_fixed_string_t name;
  5.         cmdline_ipaddr_t ip;
  6. };

  7. static void cmd_add_parsed(void *parsed_result,struct cmdline *cl,
  8.                           __attribute__((unused))void *data)
  9. {
  10.         struct cmd_add_result *res = parsed_result;
  11.         cmdline_printf(cl,"add %s successfully\n",res->name);
  12. }

  13. /*初始化token,根据其在记录结果的数据结构中的偏移,对结果数据结构成员进行赋值,
  14.   根据token的类型不一样,进行不一样的初始化
  15.   就是有一个tokens ,他的第一个token是add ,就可以找到cmd_add 这个命令句柄,从而调用相关的函数等*/
  16. cmdline_parse_token_string_t cmd_action_add =
  17. TOKEN_STRING_INITIALIZER(struct cmd_add_result,action,"add"); /*字符串 add ,表示这个成员只能是add,就是tokens的第一
  18.                                                                 个字段,如果想允许多个字段,用“#”隔开即可*/
  19. cmdline_parse_token_string_t cmd_name_add =
  20. TOKEN_STRING_INITIALIZER(struct cmd_add_result,name,NULL); /*NUL ,表示这个成员是通配的,都可以*/
  21. cmdline_parse_token_ipaddr_t cmd_ip =
  22. TOKEN_IPADDR_INITIALIZER(struct cmd_add_result,ip); /*ip只有两种,一种是ipv4,一种是ipv6,定死了,如果输入的ip 不符
  23.                                                       合ipv4或者ipv6的格式,就会显示bad arguments*/

  24. cmdline_parse_inst_t cmd_add = {
  25.         .f = cmd_add_parsed, /*用户自定义的解析后的回调处理函数,*/
  26.         .data = NULL, /*回调函数的第三个参数*/
  27.         .help_str = "add ", /*shift +? 显示的帮助的内容*/
  28.         .tokens = { /*token 代表一条命令,这个命令是有顺序的,第一个是action,第二个是name,第三个是ip,以NULL 结束*/
  29.                 (void *)&cmd_action_add,
  30.                 (void *)&cmd_name_add,
  31.                 (void *)&cmd_ip,
  32.                 NULL,
  33.         },
  34. };

  35. cmdline_parse_ctx_t main_ctx[] = {
  36.         (cmdline_parse_inst_t*)&cmd_add, /*命令实例*/
  37.         (cmdline_parse_inst_t*)&cmd_del, /*命令实例*/
  38.         NULL,                            /*必须以NULL 结尾*/
  39. };


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 类型,可参考原有的类型进行自定义
阅读(3067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~