我想大家应该都知道在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(),布布扣,bubuko.com
【转载】在LoadRunner中执行命令行程序之:popen()取代system()
原文:http://www.cnblogs.com/yezhaohui/p/3642782.html