假如程序命令行啟動時,需要指定一系列參數,那么,getopt()與getopt_long()是你的不二選擇。
作為曾經還在手寫的孩紙,我發現這個之后,淚流滿面。。
1. int getopt(int argc, char * const argv[], const char *optstring)
若選項在optstring中,返回選項字符,否則返回-1;與該選項對應的參數保存在變量optarg中
包含在unistd.h,argc和argv與main(int argc, char *argv[])的參數相對應,
optstring是選項字符集,表現為在啟動命令行中'-'后面的首個字符,例如:ls -l -a, 'a'和'l'即在optstring中。
optstring的格式規范如下:
1) 單個字符為參數選項
2) 選項字符后面跟':',表示該選項必須具備參數,參數與選項之間以空格分隔,例如:start -f flile
3) 選項字符后面跟'::', 表示該選項必須具備參數,參數緊跟選項,二者連接在一起,此為GNU的擴充,例如:start -ffile
2. int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
若選項在optstring中,返回選項字符,否則返回-1;與該選項對應的參數保存在變量optarg中
包含在getopt.h中,getopt_long()可以看成是支持長選項的getopt(),argc和argv與main(int argc, char *argv[])的參數相對應,
長選項是以"--"開頭的,舉個例子:"-h"與"--help"
20世紀90年代,Unix應用程序開始支持長選項,Linux是類Unix系統,因此兼容長選項
getopt_long()的前3個參數與getopt()相同,第4個參數是指向option結構的數組,option結構被稱為“長選項表”。longindex參數如果沒有設置為NULL,那么它就指向一個變量,這個變量會被賦值為尋找到的長選項在longopts中的索引值,這可以用於錯誤診斷。
option結構在getopt.h中的聲明如下:
struct option {
const char *name;
int has_args;
int *flag;
int val;
};
name:選項字符串
has_args:三種參數類型,no_argument表示無參數(0),required_argument表示需要參數(1),optional_argument表示參數可選(2)
flag:如果為NULL,getopt_long()返回該結構val字段中的數值;如果不為NULL,getopt_long()會使得它所指向的變量中填入val字段中的數值,並且getopt_long()返回0;通常flag設置為NULL,val設置為與該長選項對應的短選項
val:發現了長選項時的返回值,或者flag不是NULL時載入*flag中的值。典型情況下,若flag不是NULL,那么val是個真/假值,譬如1 或0;另一方面,如果flag是NULL,那么val通常是字符常量,若長選項與短選項一致,那么該字符常量應該與optstring中出現的這個選項的參數相同。
以下是個示例:
1 #include <unistd.h>
2 #include <getopt.h>
3
4 struct option opts[] = {
5 {"config", required_argument, NULL, 'f'},
6 {"help", no_argument, NULL, 'h'},
7 {"version", no_argument, NULL, 'v'}
8 };
9
10 int32_t main(int32_t argc, char **argv) {
11 char *configfile = NULL;
12 int32_t opt = 0;
13 //while ((opt = getopt(argc, argv, "f:hv")) != -1) {
14 while ((opt = getopt_long(argc, argv, "f:hv", opts, NULL)) != -1) {
15 switch (opt) {
16 case 'f':
17 configfile = strdup(optarg);
18 break;
19 case 'h':
20 LOG1("Usage: ./chatserver -hv | [-f configure_file]");
21 LOG1(" -f --config configure file");
22 LOG1(" -h --help help information");
23 LOG1(" -v --version help information");
24 return 0;
25 case 'v':
26 LOG1("version 1.0.0");
27 return 0;
28 default:
29 LOG1("Usage: ./chatserver -hv | [-f configure_file]");
30 LOG1(" -f --config configure file");
31 LOG1(" -h --help help information");
32 LOG1(" -v --version help information");
33 return -1;
34 }
35 }
36 return 0;
37 }
