WebBench源碼分析

源碼分析共享地址:https://github.com/fivezh/WebBenchhtml

下載源碼後編譯源程序後便可執行:node

sudo make cleanlinux

sudo make & make installgit

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 30.
  -p|--proxy <server:port> Use proxy server for request.
  -c|--clients <n>         Run <n> HTTP clients at once. Default one.
  -9|--http09              Use HTTP/0.9 style requests.
  -1|--http10              Use HTTP/1.0 protocol.
  -2|--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/github

five@master:~/github/OpenCCode/WebBench$ ./webbench -t 10 -c 50 http://www.baidu.com/
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://www.baidu.com/
50 clients, running 10 sec.

Speed=492 pages/min, 918494 bytes/sec.
Requests: 82 susceed, 0 failed.

 

2. 源碼分析

2.1 volatile關鍵詞

volatile用法總結:(不但願編譯器優化、多任務程序可能隨時更改、設計硬件寄存器時)web

volatile的使用的場合大體有如下幾點:app

一、中斷服務程序中修改的供其它程序檢測的變量須要加volatile;函數

二、多任務環境下各任務間共享的標誌應該加volatile;源碼分析

三、存儲器映射的硬件寄存器一般也要加volatile說明,由於每次對它的讀寫均可能有不一樣意義。post

參考:[1] C語言的那些小祕密之volatile     [2] C中的volatile用法

2.2 #ifndef 和#if !defined的區別

兩者都可用於判斷是否已進行宏定義,區別之處在於後者更適用於多重判別條件的情形。

如:  #if defined(UNIX) && !defined(AIX)

參考:[3] stackoverflow: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);

 

詳見:man getopt_long

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()實現

2.4

相關文章
相關標籤/搜索