这里写自定义目录标题

  • 前言
  • Readline示例
  • 未解决问题
    • 内存检查发现有泄漏
  • 参考

前言

最近看到不少服务自带命令行,可以查询当前服务运行状态,感觉非常有用,这样就可以实时查询状态,不必打印各种日志,简化后续维护工作

Readline示例

借用人家的,稍微改了点点

#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
#include <readline/history.h>/* 提示符 */
#define PROMPT "clover>>"//命令结构体
typedef int (*CmdProcFunc)(void);
typedef struct{char         *pszCmd;CmdProcFunc  fpCmd;
}CMD_PROC;//命令处理函数定义
#define MOCK_FUNC(funcName) \int funcName(void){printf("  Enter "#funcName"!\n"); return 0;}MOCK_FUNC(ShowMeInfo);
MOCK_FUNC(SetLogCtrl);
MOCK_FUNC(TestBatch);
MOCK_FUNC(TestEndianOper);//命令表项宏,用于简化书写
#define CMD_ENTRY(cmdStr, func)     {cmdStr, func}
#define CMD_ENTRY_END               {NULL,   NULL}//命令表
static CMD_PROC gCmdMap[] = {CMD_ENTRY("ShowMeInfo",       ShowMeInfo),CMD_ENTRY("SetLogCtrl",       SetLogCtrl),CMD_ENTRY("TestBatch",        TestBatch),CMD_ENTRY("TestEndian",       TestEndianOper),CMD_ENTRY_END
};
#define CMD_MAP_NUM     (sizeof(gCmdMap)/sizeof(CMD_PROC)) - 1/*End*///返回gCmdMap中的CmdStr列(必须为只读字符串),以供CmdGenerator使用
static char *GetCmdByIndex(unsigned int dwCmdIndex)
{if(dwCmdIndex >=  CMD_MAP_NUM)return NULL;return gCmdMap[dwCmdIndex].pszCmd;
}//执行命令
static int ExecCmd(char *pszCmdLine)
{if(NULL == pszCmdLine)return -1;unsigned int dwCmdIndex = 0;for(; dwCmdIndex < CMD_MAP_NUM; dwCmdIndex++){if(!strcmp(pszCmdLine, gCmdMap[dwCmdIndex].pszCmd))break;}if(CMD_MAP_NUM == dwCmdIndex)return -1;gCmdMap[dwCmdIndex].fpCmd(); //调用相应的函数return 0;
}//剔除字符串首尾的空白字符(含空格)
static char *StripWhite(char *pszOrig)
{if(NULL == pszOrig)return "NUL";char *pszStripHead = pszOrig;while(isspace(*pszStripHead))pszStripHead++;if('\0' == *pszStripHead)return pszStripHead;char *pszStripTail = pszStripHead + strlen(pszStripHead) - 1;while(pszStripTail > pszStripHead && isspace(*pszStripTail))pszStripTail--;*(++pszStripTail) = '\0';return pszStripHead;
}void ReadCmdLine(char *cmd, size_t cmdlen)
{//读取用户输入的命令行char *pRead = readline(PROMPT);//剔除命令行首尾的空白字符。若剔除后的命令不为空,则存入历史列表char *pTrim = StripWhite(pRead);if(pTrim && *pTrim){add_history(pTrim);}snprintf(cmd, cmdlen, "%s", pTrim);free(pRead);pRead = NULL;return;
}static char *CmdGenerator(const char *pszText, int dwState)
{static int dwListIdx = 0, dwTextLen = 0;if(!dwState){dwListIdx = 0;dwTextLen = strlen(pszText);}//rl_line_buffer用户全部输入内容//printf("%s, %d,%s\n", pszText, dwState,rl_line_buffer);//当输入字符串与命令列表中某命令部分匹配时,返回该命令字符串const char *pszName = NULL;while((pszName = GetCmdByIndex(dwListIdx))){dwListIdx++;if(!strncmp (pszName, pszText, dwTextLen)){return strdup(pszName);}}rl_attempted_completion_over = 1;//不进行文件匹配return NULL;
}static char **CmdCompletion(const char *pszText, int dwStart, int dwEnd)
{char **pMatches = NULL;if(0 == dwStart)    /* 进处理第一个单词 */{pMatches = rl_completion_matches(pszText, CmdGenerator);}else{/* 后续单词不处理,可根据需要修改 */rl_attempted_completion_over = 1;//不进行文件匹配}return pMatches;
}int main(void)
{char cmd[128];/* 初始化自动补全函数 */rl_attempted_completion_function = CmdCompletion;/* 主循环 */while(1){cmd[0] = '\0';/* 读取输入 */ReadCmdLine(cmd, sizeof(cmd));/* 执行命令 */ExecCmd(cmd);}return 0;
}

编译:

gcc -Wall -o ReadLine Readline.c  -lreadline -lncurses

示例比较简单,就是输入一些东西,然后能通过TAB自动补全或显示待选项
先调用readline函数进行输入处理,readline中会响应tab键,然后在屏幕上输出待选项
readline会调用rl_attempted_completion_function,该函数会进行补全处理
如果输入的内容不能匹配预制的内容,那么默认动作会去匹配文件夹下的文件T_T
如果不想匹配文件那么把rl_attempted_completion_over设置成非0即可^_^

未解决问题

内存检查发现有泄漏

valgrind --leak-check=full --show-reachable=yes ./ReadLine

==21728== LEAK SUMMARY:
==21728==    definitely lost: 0 bytes in 0 blocks
==21728==    indirectly lost: 0 bytes in 0 blocks
==21728==      possibly lost: 0 bytes in 0 blocks
==21728==    still reachable: 90,251 bytes in 167 blocks
==21728==         suppressed: 0 bytes in 0 blocks

还不知道怎么解决,请各路大神指教

参考

https://blog.csdn.net/xuancbm/article/details/81436681
https://www.cnblogs.com/clover-toeic/p/3892688.html
https://tiswww.case.edu/php/chet/readline/readline.html#IDX256

ReadLine使用相关推荐

  1. Python 读取文本时的 read/readline/readlines

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zhrq95/article/detai ...

  2. python 的文件读写方法:read readline readlines wirte   writelines

    read()方法读入整个文件,把整个文件以字符串形式返回. readline()  方法每次只读一行,每运行一次只读一行.如果要读整个文件,需要结合循环判断文件结束. python判断文件末尾的标志是 ...

  3. Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)...

    1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中  数据源: a.txt -- 读取数据 ...

  4. python文件操作(open()、write()、read()、readline()、readlines()、seek()、os)

    1. ⽂件操作的作⽤         ⽂件操作的作⽤就是把⼀些内容(数据)存储存放起来,可以让程序下⼀次执⾏的时候直接使⽤,⽽不必重新制作⼀份,省时省⼒. 2. ⽂件的基本操作 2.1 ⽂件操作步骤 ...

  5. java readline读取最后一行_java的转换流解析

    java的转换流是什么?在<java网络编程>有这样一段话 "Reader和Writer最重要的子类是InputStreamReader和OutputStreamWriter类. ...

  6. R语言readLines函数、n.readLines函数、readline函数读取文本文件实战

    R语言readLines函数.n.readLines函数.readline函数读取文本文件实战 目录 R语言readLines函数.n.readLines函数.readline函数读取文本文件实战 # ...

  7. GNU Readline 库及编程简介【转】

    转自:https://www.cnblogs.com/hazir/p/instruction_to_readline.html 用过 Bash 命令行的一定知道,Bash 有几个特性: TAB 键可以 ...

  8. java编写socket使用bufferedReader.readLine()问题研究

    不写java代码好久,临时写个socket通讯竟然失败,郁闷之下仔细研究了下. 客户端使用BufferedReader来读取数据,在while中调用BufferedReader.readLine()函 ...

  9. Console.ReadLine(); 获取用户输入内容

    Console.ReadLine(); 用于让用户从键盘上输入一句话,当程序执行到这句话时程序就会自动暂停等待用户输入,按回车继续执行,如果想得到用户输入内容,就须要定义一个字符串类型的变量来接收 代 ...

  10. python readline_python文件读read()、readline()、readlines()对比

    读取文件的三个方法:read().readline().readlines().均可接受一个变量用以限制每次读取的数据量,但通常不使用.本章目的是分析和总结三种读取方式的使用方法和特点. 一.read ...

最新文章

  1. 4、EIGRP配置实验之手动汇总
  2. Android -- Intent
  3. MongoDB (二) MongoDB 优点
  4. 轻松看懂java设计模式简单工厂模式
  5. python 随机数 随即字符 打乱元素顺序 random.randint()[uniform(), choice(), randrange(), shuffle(), sample()]
  6. react 判断图片是否加载完成_如何判断图片(img)是否已经加载成功--基于react...
  7. asp.net 强制性单一登陆现实
  8. NOIP2018洛谷P5021:修建赛道
  9. python程序代码解析_Python源码分析3 – 词法分析器PyTokenizer
  10. 怎么看待MYSQL的性能
  11. 斐波那契数列大数的压位c语言,HDU 1568 Fibonacci(大数前4位)
  12. 我是一个人喜欢写博客的人
  13. PDF不小心删掉了怎么恢复?4个方法隔壁家老王已经恢复了
  14. 【AI创造营】网抑云选手等级鉴定器
  15. Eclipse中使用search功能,搜索内容无法多窗口打开
  16. linux后台开发之什么是缓存系统三座大山
  17. CentOS文件备份|还原
  18. Browsers Series_2_Firefox
  19. BetaFlight模块设计之二十六:接收机任务分析
  20. 网络拓扑结构可视化呈现方案

热门文章

  1. 微信小程序开发(一) 动态修改页面标题
  2. Soot 命令行或程序运行常见问题
  3. 蓝桥杯T35 危险系数(DFS)
  4. 2021年,Flutter 与 React Native该如何选择?
  5. LabVIEW浮点型和双精度数据类型之间的精度差异是什么 为什么 在LabVIEW 中, 浮点 数 会 失去 精度?
  6. 打印机老是需要用户干预_打印机需要用户干预怎么解决,打印机提示需要用户干预...
  7. MOTO被裁团队被行业巨头争抢的背后
  8. 从一道CTF题学习PHP反序列化漏洞
  9. 【Apriori算法和FP-growth算法】
  10. android 设置壁纸会卡顿,你的安卓手机用久了卡顿吗?只要这样操作保准像新机一样流畅...