【转载】在LoadRunner中执行命令行程序之:popen()取代system()
我想大家应该都知道在LoadRunner可以使用函数system()来调用系统指令,结果同在批处理里执行一样。
但是system()有个缺陷:无法获取命令的返回结果。
也许你可以用`echo command > file`将结果输出到文件,然后再读出来。多痛苦的一件事啊!当虚拟用户多的时候,你还得考虑重复写同一个文件存在的风险。或是将文件名进行参数化以保证不同相同的文件,但这样又加大了IO的负载。
实际上有更好的解决办法:使用popen()
popen()用法上类似于fopen(),但不需要打开文件,直接读取数据流。全内存操作,不需要考虑文件覆盖,更不存在磁盘IO。
举例如下:
#define BUFFER_SIZE 10240 // 初始给10KB
Action(){
long fp; // 流的指针
int count; // 流的长度
char buffer[BUFFER_SIZE]; // 给输出分配内存空间
/*
* 下来我们来获取当前系统的用户名称
*/
fp = popen("echo %USERDOMAIN%", "r");
if (fp == NULL) {
lr_error_message("命令执行失败");
return -1;
}
count = fread(buffer, sizeof(char), BUFFER_SIZE, fp); // 读取返回数据
if (feof(fp) == 0) {
lr_error_message("请给流分配更多的内存空间,谢谢!");
return -1;
}
if (ferror(fp)) {
lr_error_message ("流读取失败");
return -1;
}
buffer[count] = NULL;
lr_output_message("Notify:当前用户: %s", buffer);
pclose(fp);
return 0;
}
输出:
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(28): Notify:当前用户: higkoo
Ending action Action.
Ending iteration 1.
Ending Vuser...
OK,下面再举个例子,逐行获取结果并逐行输出:
extern char* strtok(char *token, const char *delimiter); // 提前申明
#define BUFFER_SIZE 20480 // 初始给它20 KB先
Action(){
long fp; // 流指针
int count; //流长度
char buffer[BUFFER_SIZE]; // 给流分配内存
char * token;
char param_buf[10]; // 用于保存参数名称
int i;
/*
* 显示已安装设备驱动程序列表
*/
fp = popen("DRIVERQUERY", "r");
if (fp == NULL) {
lr_error_message("命令执行失败");
return -1;
}
count = fread(buffer, sizeof(char), BUFFER_SIZE, fp); // 拿返回结果
if (feof(fp) == 0) {
lr_error_message("返回值过多,请加大流长度");
return -1;
}
if (ferror(fp)) {
lr_error_message ("结果读取失败");
return -1;
}
buffer[count] = NULL;
token = (char*) strtok(buffer, "\n"); // 按换行符分割
if (token == NULL) {
lr_error_message ("返回值里没有换行");
return -1;
}
i = 1;
while (token != NULL) { // 逐行的读结果
sprintf(param_buf, "output_%d", i);
lr_save_string(token, param_buf);
i++;
token = (char*) strtok(NULL, "\n");
}
lr_save_int(i-1, "output_count");
for (i=1; i<=lr_paramarr_len("output"); i++) {// 把所有行都打出来
lr_output_message("设备信息: %s", lr_paramarr_idx("output", i));
}
pclose(fp);
return 0;
}
这个结果比较多,略。
最新文章
- 第3月第19天 cxx_destruct dispatch_get_main_queue()死锁
- CNN车型分类总结
- H5移动前端开发常用高能css3汇总
- c#-快速排序-算法
- 解决UIButton 连续点击重复响应事件问题
- Javascript图片裁切
- GMap.Net开发之技巧小结
- CSS 3 选择器
- JAVA并发的性能调整
- IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)
- java:构造函数
- MySQL索引与优化策略
- ListView与RadioButton组合——自定义单选列表
- centos6.5中rpm包安装mysql5.7(初始化出错如何解决)
- hystrix服务降级(3)
- Tarjan + bfs HYSBZ 1179Atm
- Java后期拓展(一)之Redis
- Linux之Samba部署
- python基础语法、数据结构、字符编码、文件处理 练习题
- C#基于wpf编写的串口调试助手
热门文章
- 编辑并列DIV
- Java Hour 27 Concurrent
- loj 1021(状压dp+记忆化搜索)
- http://jingyan.baidu.com/article/636f38bb3eb78ad6b8461082.html
- 简单几何(相对运动距离最值) UVA 11796 Dog Distance
- Mina小例子
- winform学习之----重新绘制边框方法延伸
- 简单了解Flux,注意这是一个设计思想,是一个架构!!!!!
- jQuery加载外部文件的方式get、post、ajax、load的区别及异步加载的实现
- Add SSH Key to GitLab on Windows