【转载】在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 中的命令行提 ...
随机推荐
- 更改Windows控制台默认缓冲区行数和宽度
Windows控制台窗口默认的显示行数很少, 以至于有时候要显示很多东西的时候, 总是导致前面的内容丢失. 很不爽. 于是GG了下, 在StackOverflow上找到了答案~~~ 设置方式: 1. ...
- mysql事务处理的意义
MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关 1.MyISAM:不支持事务,用于只读程序提高性能 .InnoDB:支持ACID事务.行级锁.并发 .Berkeley DB:支 ...
- POJ3764 The xor-longest Path(Trie树)
题目给一棵有边权的树,问树上任意两点路径上的边异或值最多是多少. 记录每个点u到根路径的异或值xor[u],那么任意两点u.v路径的异或值就是xor[u]^xor[v]. 于是这个问题就变成了从n个数 ...
- ural 1247. Check a Sequence
1247. Check a Sequence Time limit: 0.5 secondMemory limit: 64 MB There is a sequence of integer numb ...
- C++做client Java做客户端传送数据
因为要用到,但发现Java怎么都收不到C发来的数据,除非C端自动挂掉,java会一口气全收回来. 后来才发现是因为C发过来的Java用readline是读不到回车的,所以会一直等待. 所以不要用rea ...
- 【BZOJ】1441: Min(裴蜀定理)
http://www.lydsy.com/JudgeOnline/problem.php?id=1441 这东西竟然还有个名词叫裴蜀定理................ 裸题不说....<初等数 ...
- 【POJ】1062 昂贵的聘礼(spfa)
http://poj.org/problem?id=1062 此题一开始果断想到暴力.. 但是n<=100果断不行. 一看题解,噗!最短路... 构图很巧妙. 每一个物品对应的所需物品相当于一个 ...
- 关于实现banner轮换的问题,如何修改
最近遇到了这样的问题,本来banner都是gif格式的,但是现在要求上传图片格式为jpg时,运用JS实现动画效果,原来的也能用. aspx: <div id="bh" run ...
- state配置语言实战
修改配置文件:(base用来放初始化环境.prod用来放生产配置环境) [root@super65 ~]# vim /etc/salt/master [root@super65 ~]# mkdir - ...
- [百科] - SIP(会话发起协议)
SIP(会话发起协议)SIP是类似于HTTP的基于文本的协议.SIP可以减少应用特别是高级应用的开发时间.由于基于IP协议的SIP利用了IP网络,固定网运营商也会逐渐认识到SIP技术对于他们的深远意义 ...