zoukankan      html  css  js  c++  java
  • 在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, " "); // 按换行符分割
        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, " ");
        }
        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远程服务器资源使用情况

  • 相关阅读:
    关于 CS1595 MS的知识库还是不全面,反正它给我的解决方法不能用,偶只有这样做了....
    被一贴,一个以前写的邮件发送的小类库。记住了,不是内裤
    [下载]活学活用DataGrid控件与ADO.NET
    不同浏览器透明度的写法
    通过文件读取oep值
    菜单
    CWnd::OnContextMenu函数(右键单击弹出快捷菜单)
    poj 3349(hash)
    poj 3009(dfs+回溯 模拟)
    poj 3026 (bfs+prim)
  • 原文地址:https://www.cnblogs.com/defias/p/3286024.html
Copyright © 2011-2022 走看看