源码分析共享地址:https://github.com/fivezh/WebBench
下载源码后编译源程序后即可执行:
sudo make clean
sudo make & make install
1. 使用方法
five@master:~/github/OpenCCode/WebBench$ ./webbench
webbench [option]... URL
-f|--force Don't wait for reply from server.
-r|--reload Send reload request - Pragma: no-cache.
-t|--time <sec> Run benchmark for <sec> seconds. Default .
-p|--proxy <server:port> Use proxy server for request.
-c|--clients <n> Run <n> HTTP clients at once. Default one.
-|--http09 Use HTTP/0.9 style requests.
-|--http10 Use HTTP/1.0 protocol.
-|--http11 Use HTTP/1.1 protocol.
--get Use GET request method.
--head Use HEAD request method.
--options Use OPTIONS request method.
--trace Use TRACE request method.
-?|-h|--help This information.
-V|--version Display program version.
实例:./webbench -t 10 -c 50 http://www.baidu.com/
five@master:~/github/OpenCCode/WebBench$ ./webbench -t -c http://www.baidu.com/
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar -, GPL Open Source Software. Benchmarking: GET http://www.baidu.com/
clients, running sec. Speed= pages/min, bytes/sec.
Requests: susceed, failed.
2. 源码分析
2.1 volatile关键词
volatile用法总结:(不希望编译器优化、多任务程序可能随时更改、设计硬件寄存器时)
volatile的使用的场合大致有以下几点:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义。
参考:[1] C语言的那些小秘密之volatile [2] C中的volatile用法
2.2 #ifndef 和#if !defined的区别
二者均可用于判断是否已进行宏定义,区别之处在于后者更适用于多重判别条件的情形。
如: #if defined(UNIX) && !defined(AIX)
参考:[3] *:difference-between-ifndef-and-if-defined-in-c
2.3 getopt_long函数
除getopt()提供的短选项(short options, 比如-s)解析外,还提供长选项(long options,比如--name)解析,参数原型为:
#include <unistd.h>
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
#include <getopt.h>
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
getopt_long() and getopt_long_only()
The getopt_long() function works like getopt() except that it also
accepts long options, started with two dashes. (If the program accepts
only long options, then optstring should be specified as an empty
string (""), not NULL.) Long option names may be abbreviated if the
abbreviation is unique or is an exact match for some defined option. A
long option may take a parameter, of the form --arg=param or --arg
param.
参考:[4] linux 中解析命令行参数 (getopt_long用法) [5]Wikipedia getopt() [6] IBM 使用 getopt() 进行命令行处理【推荐阅读】
注意:注意的是默认情况下getopt会重新排列命令行参数的顺序,所以到最后所有不包含选项的命令行参数都排到最后(参考)。
几个重要全局变量:
optarg:处理带输入参数的选项时,选项参数保存至char *optarg中。
optind:下一个处理的选项在argv中的地址,所有选项处理完后,optind指向未识别的项。
optopt:最后一个已知项。
问题1:该函数的实现是如何做的?
答:getopt()的GNU实现,getopt_long()的NetBSD实现 ,一种getopt_long()的简单实现。
问题2:当短参数作为输入时,该函数如何返回?
答:getopt_long()是同时支持长选项和短选项的getopt()实现。