本文共 1503 字,大约阅读时间需要 5 分钟。
作者:GentlemanTsao
https://blog.csdn.net/GentelmanTsao已有业务逻辑:通过命令行终端可以登录telnet本地服务,并输入指令查询拓扑讯息。
例如:telnet 127.0.0.1 7777 # 登录到本地td s2 #子指令,查询拓扑讯息exit #退出telnet
现在我们要将上述步骤使用C语言做成一个指令:gettopo。
调用gettopo则执行上述操作,提取出关键字串并打印输出。首先,写一个topology.sh脚本,用于自动登录telnet并查询拓扑
#!/bin/ship="127.0.0.1"port=7777inputfile=in input1="td s2"input2="exit"rm -fr $inputfile mknod $inputfile p exec 8<>$inputfile telnet $ip $port <&8 &sleep 1; echo $input1 >> $inputfile echo $input2 >> $inputfile
在该脚本中,input1和input2分别设置了子指令,通过管道输入telnet,从而实现登录telnet后执行预设指令。
上述的shell脚本是以文件的形式存放在模块源码中。
我们添加以下内容到makefile,将脚本安装到/usr/sbin目录下define Package/meshconfig/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) ./files/topology.sh $(1)/usr/sbin/topoendef
现在我们可以直接调用topo来查询拓扑信息了。
接下来用C语言实现get_topology方法,目标是调用topo指令,并提取需要的内容。char* get_topology(void){ char buf[256] = { 0}; FILE *fp = NULL; static char result[16384] = { 0}; char* filter_oneline_result; memset(result,0,sizeof(result)); if( (fp = popen("topo", "r")) == NULL ) { perror("popen error!\n"); printf("popen error!\n"); }else { while (fgets(buf, sizeof(buf), fp)) { filter_oneline_result = filter_topo_buffer_oneline(buf); strcat(result,filter_oneline_result); } pclose(fp); } return result;}
该方法的实现过程:
1.使用popen来调用topo指令; 2.使用fgets来获取topo的输出; 3.自定义filter_topo_buffer_oneline方法提取需要的内容; 4.最后将结果copy到result中filter_topo_buffer_oneline是自定义方法,作用是从字符串中提取出想要的内容。
具体实现请查看另一篇:0(n_n)0