【转载】在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;
}
这个结果比较多,略。
【转载】在LoadRunner中执行命令行程序之:popen()取代system()的更多相关文章
- 在LoadRunner中执行命令行程序之:popen()取代system()
我想大家应该都知道在LoadRunner可以使用函数system()来调用系统指令,结果同在批处理里执行一样. 但是system()有个缺陷:无法获取命令的返回结果. 也许你可以用`echo comm ...
- LoadRunner中执行命令行
在LoadRunner可以使用函数system()来调用系统指令,结果同在批处理里执行一样,但是system()有个缺陷:无法获取命令的返回结果. 也许可以用`echo command > fi ...
- Android 在Android代码中执行命令行
1.路径最好不要是自己拼写的路径/mnt/shell/emulated/0/wifidog.conf 最好是通过方法获取的路径,不然可能导致命令无效 (挂载点的原因) public static f ...
- 如何在 Inno Setup 中执行命令行的命令
Pascal Scripting: Exec Prototype: function Exec(const Filename, Params, WorkingDir: String; const Sh ...
- 【转载】在LoadRunner向远程Linux/Unix执行命令行并收集性能数据
前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对“在LoadRunner中执行命令行程序之:pope ...
- 在LoadRunner向远程Linux/Unix执行命令行并收集性能数据
前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对“在LoadRunner中执行命令行程序之:pope ...
- android程序中使用命令行及获得命令行执行后的内容
在开发android项目中,需要在程序中使用命令行执行,获得命令行执行后的结果并做处理. 下面是自己写的一个小例子,供以后参考使用: public String android_command(){ ...
- [转]Windows中的命令行提示符里的Start命令执行路径包含空格时的问题
转自:http://www.x2009.net/articles/windows-command-line-prompt-start-path-space.html 当使用Windows 中的命令行提 ...
- 转:Windows中的命令行提示符里的Start命令执行路径包含空格时的问题
转自:http://www.x2009.net/articles/windows-command-line-prompt-start-path-space.html 当使用Windows 中的命令行提 ...
随机推荐
- hdu 1045:Fire Net(DFS经典题)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- C++primer学习笔记(二)——Chapter 4
4.1 Fundamentals 1.Basic Concepts (1)操作符分为一元,二元或者三元操作符: (2)复杂的表达式中含有很多操作符时: 规则一:分为不同的级别,级别高的先运行: 规则 ...
- 水题 ZOJ 3869 Ace of Aces
题目传送门 水题,找出出现次数最多的数字,若多个输出Nobody //#include <bits/stdc++.h> //using namespace std; #include &l ...
- SPOJ962 Intergalactic Map(最大流)
题目问一张无向图能否从1点走到2点再走到3点,且一个点只走一次. 思维定势思维定势..建图关键在于,源点向2点连边,1点和3点向汇点连边! 另外,题目数据听说有点问题,出现点大于n的数据.. #inc ...
- ural 1269. Obscene Words Filter
1269. Obscene Words Filter Time limit: 0.5 secondMemory limit: 8 MB There is a problem to check mess ...
- SplendidCRM 中文语言包改正版
由于官方的中文语言包太多地方词不达意,可能是文化差异吧,如“删除”却写成“德尔”.本人修改了几十个地方,还修改了不能清除已有数据的Bug.相关文件在下载包中. http://files.cnblogs ...
- How Many Trees?[HDU1130]
How Many Trees? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- C#线程间同步无法关闭
用C#做了个线程间同步的小程序,但每次关闭窗口后进程仍然在,是什么原因? 解决方法: 要加一句 线程.IsBackground = true; 否则退出的只是窗体 上面的方法没看懂... MSDN上说 ...
- 详细讲解css单位px,em和rem的含义以及它们之间的区别
一.首先介绍一下px px就是css中最基本的长度单位了,用px做单位基本上没什么问题,可以做到让页面按套路精确的展现! 可但是!但可是!如果全篇用px布局会暗藏一个蛋疼的问题,就是当用户和Ctrl滚 ...
- [iOS] UIImage和CGImageRef
CGImageRef并不是面向对象的API,也不是类,只是一个指针类型,Quartz 2D对CGImageRef的定义为: typedef struct CGImage *CGImageRef; 由此 ...