歡迎您光臨本站 註冊首頁

Linux操作系統的程序命令行處理分析

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

Linux操作系統的程序命令行處理分析


  GNU/Linux命令行習慣

  幾乎所有的GNU/Linux程序都遵循一些同樣的命令行解釋習慣,程序的參數通常分為了兩大類:選項(option)或者一些標誌(flag)、其他參數。選項(option)主要是提供給程序一些運行上的選擇,而其他參數則通常是提供給程序運行的輸入之類的值。按照習慣,選項通常有兩種表達形式:

  短形式:通常是由一個「-」加上一個字母組合而成。這種形式的好處是輸入快捷。

  長形式:通常是由兩個「-」加上一個單片語合而成。這種形式的好處是形象、好記、直觀。

  通常來說,一個程序讀於這兩種形式都支持。例如大多數的程序都有這樣的調用選項:「-h」和「??help」。一些選項需要知道後面跟著的參數,例如「ls ?s /」,這裡其中的「/」就是一個參數。

  使用getopt_long函數來處理

  對於一個命令行的分析處理是很單調乏味的工作,需要做大量的諸如字元串的匹配之類的操作,不過幸運的是,GNU C函數庫 裡面提供了一個函數能夠使得這項工作變得容易得多。當然也許仍然沒有你想象的那麼容易。getopt_long這個函數就能夠同時「理解」長形式和短形式的參數。

  下面我們通過一個實例來學習這個函數的使用。

  假設我們要編寫的一個程序需要處理以下幾個參數:


短形式 長形式 含義

-h ??help 列印幫助信息

-s ??server 伺服器IP地址

-b ??background 後台執行

  要使用getopt_long()這個函數,我們需要提供兩個數據結構,第一個是一個字元串,該字元串中的每個字元來表示短形式的選項,如果某個選項後面需要跟一個參數,那麼就需要在這個字元後面加上一個「:」(冒號),例如「hs:b」就是我們這個例子中的結構。為了定義長形式表達的選項,我們需要定一個結構體數組。數組的每一項與一個長形式的參數相關,每項包括四個參數:通常來說,第一項是長形式的選項的字元串表達;第二項與後面是否有參數提取有關,如果後面有參數需要處理就是1,否則是0;第三項是NULL;最後一項則是與長形式相關聯的短形式表達的字元。另外,這個數組的最後一項必須全部置為0。

  根據上面的說明,對於我們的例子,可以得到下面的一個數組:



const struct option long_options [] =={
{「help 」,0,NULL,『h 』 }},
{「server 」,1,NULL,『s 』 }},
{「background」,0,NULL,『b 』 }},
{NULL,0,NULL,0 }
};

  我們把傳給main函數的參數給getopt_long,他就一項一項的讀取處理,返回短形式表達的選項的字元,如果沒有找到選項則返回-1。通常我們都是在一個循環裡面反覆調用getopt_long,然後通過一個switch語句來處理不同的選項。如果getopt_long遇到一個沒有定義的選項,則會返回一個「?」(問號)字元。下面是我們的例子,這是一個很典型的處理過程:



#include
#include
#include
const char*program_name;
void print_usage (FILE*stream,int exit_code)
{
fprintf (stream,「Usage:%s options [ inputfile ....]
」,program_name);
fprintf (stream,
「 -h --help Display this usage information.

「 -s --server ip Set the server IP.

「 -b --background run in the backgound.
」);
exit (exit_code);
}
int main (int argc,char*argv [])
{
int next_option;
const char*const short_options =「hs:b 」;
const struct option long_options [] =={
{「help 」,0,NULL,『h 』 }},
{「server」,1,NULL,『s 』 }},
{「background 」,0,NULL,『b 』 }},
{NULL,0,NULL,0 }
};
const char*output_filename =NULL;
int verbose =0;
program_name =argv [0 ];
do {
next_option =getopt_long (argc,argv,short_options,
long_options,NULL);
switch (next_option)
{
case 『h 』:/*-h or --help */
print_usage (stdout,0);
case 『s 』:/*-o or --output */
//ip =optarg;
break;
case 『b 』:/*-v or --verbose */
break;
case 『?』:/*The user specified an invalid option.*/
code one (indicating abnormal termination).*/
print_usage (stderr,1);
case -1:/*Done with options.*/
break;
default:/*Something else:unexpected.*/
abort ();
}
}
while (next_option !=-1);
/*The main program goes here.*/
return 0;
}

[火星人 ] Linux操作系統的程序命令行處理分析已經有280次圍觀

http://coctec.com/docs/linux/show-post-151853.html