我想大家应该都知道在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()的更多相关文章

  1. 在LoadRunner中执行命令行程序之:popen()取代system()

    我想大家应该都知道在LoadRunner可以使用函数system()来调用系统指令,结果同在批处理里执行一样. 但是system()有个缺陷:无法获取命令的返回结果. 也许你可以用`echo comm ...

  2. LoadRunner中执行命令行

    在LoadRunner可以使用函数system()来调用系统指令,结果同在批处理里执行一样,但是system()有个缺陷:无法获取命令的返回结果. 也许可以用`echo command > fi ...

  3. Android 在Android代码中执行命令行

    1.路径最好不要是自己拼写的路径/mnt/shell/emulated/0/wifidog.conf 最好是通过方法获取的路径,不然可能导致命令无效  (挂载点的原因) public static f ...

  4. 如何在 Inno Setup 中执行命令行的命令

    Pascal Scripting: Exec Prototype: function Exec(const Filename, Params, WorkingDir: String; const Sh ...

  5. 【转载】在LoadRunner向远程Linux/Unix执行命令行并收集性能数据

    前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对“在LoadRunner中执行命令行程序之:pope ...

  6. 在LoadRunner向远程Linux/Unix执行命令行并收集性能数据

    前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对“在LoadRunner中执行命令行程序之:pope ...

  7. android程序中使用命令行及获得命令行执行后的内容

    在开发android项目中,需要在程序中使用命令行执行,获得命令行执行后的结果并做处理. 下面是自己写的一个小例子,供以后参考使用: public String android_command(){ ...

  8. [转]Windows中的命令行提示符里的Start命令执行路径包含空格时的问题

    转自:http://www.x2009.net/articles/windows-command-line-prompt-start-path-space.html 当使用Windows 中的命令行提 ...

  9. 转:Windows中的命令行提示符里的Start命令执行路径包含空格时的问题

    转自:http://www.x2009.net/articles/windows-command-line-prompt-start-path-space.html 当使用Windows 中的命令行提 ...

随机推荐

  1. JAVA基础学习之String、StringBuffer、StringBuilder、基本数据类型的使用、整形进制转换、集合Collection、Vector、ArrayList、LinkedList、HashSet、TreeSet等(3)

    主函数类MainDemo.java package com.itcast.test20140109; import java.util.ArrayList; import java.util.Coll ...

  2. SQL_Server_2005_函数大全(描述及实例)

    为了方便阅读,把函数分为四种类型,分别表述. SQL_Server_2005_字符串函数(描述及实例) 函数名称:ascii.char.charindex.difference.left.right. ...

  3. 食物链 poj 1182

    C - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  4. Android 编程下的 Secret Code

    我们很多人应该都做过这样的操作,打开拨号键盘输入 *#*#4636#*#* 等字符就会弹出一个界面显示手机相关的一些信息,这个功能在 Android 中被称为 Android Secret Code, ...

  5. Spring的循环依赖问题

    spring容器循环依赖包括构造器循环依赖和setter循环依赖,那Spring容器如何解决循环依赖呢?首先让我们来定义循环引用类: 在Spring中将循环依赖的处理分成了3种情况: 构造器循环依赖 ...

  6. ural 1153. Supercomputer

    1153. Supercomputer Time limit: 2.0 secondMemory limit: 64 MB To check the speed of JCN Corporation ...

  7. MFC+Android模拟器 实现 自动玩“天天爱消除”

    朋友用QT做了个自动玩的,觉得有意思,自己也想用MFC做个试试. 模拟器用的BlueStacks.Android SDK带的那个模拟器不知道是不是设置的问题,开游戏很卡. 用MFC建了对话框工程,配置 ...

  8. quick 关于触摸的问题

    以前遇到一个问题就是,如果触摸层不在最后,会导致触摸失效.这是由于下面添加的层挡住了触摸层,而后添加的层会位于上面,默认是不可点击,点击不可穿透的.所以我们必须将触摸层放置到最上面. Logic.lu ...

  9. BZOJ4140 : 共点圆加强版

    假设当前询问点为$(A,B)$,那么它在一个以$(x,y)$为圆心的圆里需要满足: $(x-A)^2+(y-B)^2\leq x^2+y^2$ $2Ax+2By\geq A^2+B^2$ 等价于询问所 ...

  10. BZOJ3648 : 寝室管理

    求环套外向树上节点数不小于K的路径数. 首先树的话直接点分治+树状数组$O(n\log^2n)$搞定 环套树的话,先删掉多余的边(a,b) 然后变成了一棵树,直接点分治 然后在树上找到a到b的路径,将 ...