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远程服务器资源使用情况

  • 相关阅读:
    (二十八)缓存:很多时候我们都用错了!
    (二十七)缓存:进程内缓存要怎么玩?
    JavaScript 获取7天之前或之后的日期
    实现文本复制功能
    vue项目 PC端点击查看大图
    vue使用canvas生成海报图
    禁用微信转发给好友和朋友圈
    vue防抖节流函数---组件封装,防止按钮多次点击
    看到几个不错的打印方式,分享几个觉得不错的
    为啥没更新呢
  • 原文地址:https://www.cnblogs.com/defias/p/3286024.html
Copyright © 2011-2022 走看看