我想大家应该都知道在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获取Linux/Unix远程服务器资源使用情况

在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. vue+webpack+VS Code入门简单的项目配置

    为了方便,这边的编译器选择的是VS Code (Visual Studio Code); 打开VS Code,选择好自己的工作空间,然后新建一个文件夹作为我们项目的文件夹,然后,show time: ...

  2. 【cpp】new delete

    double *M = new double[2*num]; double *T = new double[2 * num]; double *activeM = new double[2 * num ...

  3. Selenium私房菜系列9 -- 我遇到的问题及解决问题的方法

    Selenium私房菜系列10 -- 我遇到的问题及解决问题的方法

  4. java25个Java机器学习工具&库

    本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...

  5. [Q&A]VS 2012 MVC4专案与网站的差异?「ASP.NET组态」的Login账号出现在「新旧两组」会员数据库里面?

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/30/mvc4_vs2012_login_member_db.aspx [Q&a ...

  6. Gym 100883J palprime(二分判断点在凸包里)

    题意:判断一堆小点有多少个在任意三个大点构成的三角形里面. 思路:其实就是判断点在不在凸包里面,判断的话可以使用二分来判断,就是判断该点在凸包的哪两个点和起点的连线之间. 代码: /** @xigua ...

  7. GRANT - 定义访问权限

    SYNOPSIS GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ ...

  8. CAD控件界面显示与隐藏(网页版)

    控件界面工具栏的显示或隐藏,js代码实现如下: 1 2 3 4 5 6 7 8 9 //隐藏/显示工具栏       mxOcx.ShowToolBar("常用工具",isShow ...

  9. softmax_loss的归一化问题

    cnn网络中,网络更新一次参数是根据loss反向传播来,这个loss是一个batch_size的图像前向传播得到的loss和除以batch_size大小得到的平均loss. softmax_loss前 ...

  10. Robotium实践之路源码创建测试项目

    1.JDK安装及环境配置 2.Eclipse安装 3.ADT插件安装 4.模拟器安装 5.准备源码 6.引进源码置项目中 .文件 .导入 .选择现有项目置工作空间中 .浏览 .选择项目,选择模拟器版本 ...