我想大家应该都知道在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; 
}

这个结果比较多,略。

最新文章

  1. 第3月第19天 cxx_destruct dispatch_get_main_queue()死锁
  2. CNN车型分类总结
  3. H5移动前端开发常用高能css3汇总
  4. c#-快速排序-算法
  5. 解决UIButton 连续点击重复响应事件问题
  6. Javascript图片裁切
  7. GMap.Net开发之技巧小结
  8. CSS 3 选择器
  9. JAVA并发的性能调整
  10. IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)
  11. java:构造函数
  12. MySQL索引与优化策略
  13. ListView与RadioButton组合——自定义单选列表
  14. centos6.5中rpm包安装mysql5.7(初始化出错如何解决)
  15. hystrix服务降级(3)
  16. Tarjan + bfs HYSBZ 1179Atm
  17. Java后期拓展(一)之Redis
  18. Linux之Samba部署
  19. python基础语法、数据结构、字符编码、文件处理 练习题
  20. C#基于wpf编写的串口调试助手

热门文章

  1. 编辑并列DIV
  2. Java Hour 27 Concurrent
  3. loj 1021(状压dp+记忆化搜索)
  4. http://jingyan.baidu.com/article/636f38bb3eb78ad6b8461082.html
  5. 简单几何(相对运动距离最值) UVA 11796 Dog Distance
  6. Mina小例子
  7. winform学习之----重新绘制边框方法延伸
  8. 简单了解Flux,注意这是一个设计思想,是一个架构!!!!!
  9. jQuery加载外部文件的方式get、post、ajax、load的区别及异步加载的实现
  10. Add SSH Key to GitLab on Windows