ReadLine使用
这里写自定义目录标题
- 前言
- 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使用相关推荐
- Python 读取文本时的 read/readline/readlines
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zhrq95/article/detai ...
- python 的文件读写方法:read readline readlines wirte writelines
read()方法读入整个文件,把整个文件以字符串形式返回. readline() 方法每次只读一行,每运行一次只读一行.如果要读整个文件,需要结合循环判断文件结束. python判断文件末尾的标志是 ...
- Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)...
1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 数据源: a.txt -- 读取数据 ...
- python文件操作(open()、write()、read()、readline()、readlines()、seek()、os)
1. ⽂件操作的作⽤ ⽂件操作的作⽤就是把⼀些内容(数据)存储存放起来,可以让程序下⼀次执⾏的时候直接使⽤,⽽不必重新制作⼀份,省时省⼒. 2. ⽂件的基本操作 2.1 ⽂件操作步骤 ...
- java readline读取最后一行_java的转换流解析
java的转换流是什么?在<java网络编程>有这样一段话 "Reader和Writer最重要的子类是InputStreamReader和OutputStreamWriter类. ...
- R语言readLines函数、n.readLines函数、readline函数读取文本文件实战
R语言readLines函数.n.readLines函数.readline函数读取文本文件实战 目录 R语言readLines函数.n.readLines函数.readline函数读取文本文件实战 # ...
- GNU Readline 库及编程简介【转】
转自:https://www.cnblogs.com/hazir/p/instruction_to_readline.html 用过 Bash 命令行的一定知道,Bash 有几个特性: TAB 键可以 ...
- java编写socket使用bufferedReader.readLine()问题研究
不写java代码好久,临时写个socket通讯竟然失败,郁闷之下仔细研究了下. 客户端使用BufferedReader来读取数据,在while中调用BufferedReader.readLine()函 ...
- Console.ReadLine(); 获取用户输入内容
Console.ReadLine(); 用于让用户从键盘上输入一句话,当程序执行到这句话时程序就会自动暂停等待用户输入,按回车继续执行,如果想得到用户输入内容,就须要定义一个字符串类型的变量来接收 代 ...
- python readline_python文件读read()、readline()、readlines()对比
读取文件的三个方法:read().readline().readlines().均可接受一个变量用以限制每次读取的数据量,但通常不使用.本章目的是分析和总结三种读取方式的使用方法和特点. 一.read ...
最新文章
- 4、EIGRP配置实验之手动汇总
- Android -- Intent
- MongoDB (二) MongoDB 优点
- 轻松看懂java设计模式简单工厂模式
- python 随机数 随即字符 打乱元素顺序 random.randint()[uniform(), choice(), randrange(), shuffle(), sample()]
- react 判断图片是否加载完成_如何判断图片(img)是否已经加载成功--基于react...
- asp.net 强制性单一登陆现实
- NOIP2018洛谷P5021:修建赛道
- python程序代码解析_Python源码分析3 – 词法分析器PyTokenizer
- 怎么看待MYSQL的性能
- 斐波那契数列大数的压位c语言,HDU 1568 Fibonacci(大数前4位)
- 我是一个人喜欢写博客的人
- PDF不小心删掉了怎么恢复?4个方法隔壁家老王已经恢复了
- 【AI创造营】网抑云选手等级鉴定器
- Eclipse中使用search功能,搜索内容无法多窗口打开
- linux后台开发之什么是缓存系统三座大山
- CentOS文件备份|还原
- Browsers Series_2_Firefox
- BetaFlight模块设计之二十六:接收机任务分析
- 网络拓扑结构可视化呈现方案
热门文章
- 微信小程序开发(一) 动态修改页面标题
- Soot 命令行或程序运行常见问题
- 蓝桥杯T35 危险系数(DFS)
- 2021年,Flutter 与 React Native该如何选择?
- LabVIEW浮点型和双精度数据类型之间的精度差异是什么 为什么 在LabVIEW 中, 浮点 数 会 失去 精度?
- 打印机老是需要用户干预_打印机需要用户干预怎么解决,打印机提示需要用户干预...
- MOTO被裁团队被行业巨头争抢的背后
- 从一道CTF题学习PHP反序列化漏洞
- 【Apriori算法和FP-growth算法】
- android 设置壁纸会卡顿,你的安卓手机用久了卡顿吗?只要这样操作保准像新机一样流畅...