Linux系統呼叫 getopt 函式

2021-09-28 16:17:47 字數 2409 閱讀 9143

//函式原型

#include int getopt(int argc,char *const ar**[ ],const char *optstring);

引數說明:

**前兩個引數是main()函式的兩個引數,第3個引數是選項字串。

**返回值為int型別,我們知道char型別是可以轉換成int型別的,每個字元都有其對應的整數值,因此這個返回值返回的其實就是乙個字元,就是選項字串裡的選項字元.

當傳入的ar**中的選項全部被解析,getopt()返回-1,這也是getopt進行選項解析的迴圈截至條件;

## 介紹幾個與該函式相關的全域性變數

extern char *optarg;        //儲存選項後面的引數

extern int optind;          //指示下乙個要讀取的選項引數在ar**中的位置

extern int opterr;          //表示是否將錯誤資訊輸出到標準錯誤stderr,為0時表示不輸出,opterr非零時產生的錯誤要輸出到stderr上

extern int optopt;          //表示不在選項字串optstring中的選項

## 選項字串

"a:b:cd::e",這就是乙個選項字串,對應到的命令列的選項就是:-a,-b,-c,-d,-e。冒號表示引數,乙個冒號就表示這個選項後面必須帶有引數(沒有引數會報錯)。引數

可以和選項連在一起寫,也可以用空格隔開,例如-a123和-a 123都表示123是-a的引數;兩個冒號(::)表示這個選項的引數是可選的,既可以有引數,也可以沒有引數,但

是注意有引數時,引數和選項之間不能有空格(有空格會報錯),這一點和只有乙個冒號的選項是有區別的。對於上面的"cd:",選項-c後面是沒有引數的,選項-d後面需要有

引數。## 一般用法

while((ret = getopt(argc, ar**, "a:b:cd::e")) != -1)

}《說明》

1. 當傳入的ar**中的選項全部被解析完成,getopt()函式返回-1,這就是getopt進行解析的迴圈截止條件。

2. 如果ar**中解析出optstring中描述的選項字元,則返回該字元,如果該選項指定了引數,則全域性指標變數optarg指向該引數;

3. 如果getopt遇到乙個非optstring指定的選項字元,這表示該選項是未識別的,返回'?',並且將該選項存放到全域性變數optopt中;

4. 如果optstring指定了選項必須帶引數,但傳入的相應option丟失了引數,返回值依賴於optstring的第乙個字元,若第乙個字元是':',返回':',否則返回'?';由於非法

的選項返回也是'?',所以常常optstring的第乙個字元指定為':';同時將該選項存放到全域性變數optopt中。例如: ":a:b:cd::e"

【拓展】getopt_long() - 支援長選項的命令解析

標頭檔案: #include

原  型: int getopt_long(int argc, char *const ar**, const char *optstring, const struct option *longopts, int *longindex);

形參說明:

optstring: 選項字串。單個字元選項的用法和getopt()函式的一樣。

longopts:

struct option;

** 舉例如下:

struct option long_options = ,,};

《說明》 如果命令列的引數是-a 123,那麼呼叫getopt_long()將返回字元'a',並且將字串123由optarg返回(注意注意!字串123由optarg帶回!optarg不需要定義,在

getopt.h中已經有定義),那麼,如果命令列引數是-c,那麼呼叫getopt_long()將返回字元'c',而此時,optarg是null。最後,當getopt_long()將命令列所有引數全部解析

完成後,返回-1。

required_argument(或者是1)時,引數輸入格式為: --引數 值 或者 --引數=值。

optional_argument(或者是2)時,引數輸入格式只能為: --引數=值。

longindex: 表示當前長引數在longopts中的索引值。

extern char* optarg;

extern int optind, opterr, optopt;

optarg:指向當前選項後面的引數字串的指標。

optind:再次呼叫getopt_long時的下乙個ar**指標索引。

optopt:表示最後乙個未知選項。

#include #include int main(int argc, char * ar**)

} return 0;

}

使用系統呼叫getopt簡化對命令列引數的解析

有關系統呼叫getopt 宣告 cpp include int getopt int argc,char const argv,const char optstring extern char optarg extern int optind,opterr,optopt 使用方法 在while迴圈中...

linux 系統呼叫

使用者應用可以通過兩種方式使用系統呼叫。第一種方式是通過c庫函式,包括系統呼叫在c庫中的封裝函式和其他普通函式。圖5.2 使用系統呼叫的兩種方式 第二種方式是使用 syscall巨集。2.6.18版本之前的核心,在include asm i386 unistd.h檔案中定義有7個 syscall巨集...

Linux系統呼叫

一 實驗目的和要求 1.學習linux核心的配置和編譯 2.深入理解linux系統呼叫 3.理解arm和x86的cpu模式 系統模式 使用者模式 的不同 4.掌握核心模組的編寫方法。二 實驗器材 1.linux實驗板卡一塊 2.5v 1a電源乙個 3.microusb線一根 4.macos一台 5....