Linux命令選項及參數解析 getopt() getopt_long() 函數


假如程序命令行啟動時,需要指定一系列參數,那么,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 }



 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM