命令行參數(argc, argv)

命令行參數(argc, argv)

每個C語言程序都必須有一個稱爲main()的函數,作爲程序啓動的起點。當執行程序時,命令行參數(command-line argument)(由shell逐一解析)通過兩個入參提供給main()函數。第一個參數int argc,表示命令行參數的個數。第二個參數char *argv[],是一個指向命令行參數的指針數組,每一參數又都是以空字符(null) 結尾的字符串。第一個字符串,亦即argv[0]指向的,(通常)是該程序的名稱。argv中的指針列表以NULL指針結尾(即argv[argc]爲NULL)。

argv[0]包含了調用程序的名稱,可以利用這一特性玩個實用的小技巧。首先爲同一程序創建多個鏈接(即名稱不同),然後讓該程序查看argv[0],並根據調用程序的名稱來執行不同任務。gzip(1)、gunzip(1)和zcat(1)命令是該技術應用的一個例子,這些命令鏈接的都是同一可執行文件。(使用該技術,必須小心處理如下情況:用戶通過鏈接調用程序,但鏈接名又在該程序的意料之外。)

圖6-4展示了執行程序清單6-2中程序所傳入參argc和argv的數據結構。該圖使用C語言符號"\0"來表示每個字符串末尾的終止空字節。

程序清單6-2中的程序回顯了其命令行參數,逐一按行輸出,前面還冠以要顯示的argv成員名稱。

程序清單6-2:回顯命令行參數

因爲argv列表以NULL值終止,所以可以將程序清單6-2中的程序主體改寫如下,且每行只輸出一個命令行實參:

argc/argv參數機制的侷限之一在於這些變量僅對main()函數可用。在保證可移植性的同時,爲使這些命令行參數能爲其他函數所用,必須把argv以參數形式傳遞給這些函數,或是設置一個指向argv的全局變量。

要想從程序內任一位置訪問這些信息的部分或者全部內容,還有兩個方法,但是會破壞程序的可移植性。

通過linux系統專有的/proc/PID/cmdline 文件可以讀取任一進程的命令行參數,每個參數都以空(null)字節終止。(程序可以通過/proc/self/cmdline文件訪問自己的命令行參數。)

GNU C語言庫提供有兩個全局變量,可在程序內任一位置使用以獲取調用該程序時的程序名稱(即命令行的第一個參數)。第一個全局變量program_invocation_ name,提供了用於調用該程序的完整路徑名。第二個全局變量program_invocation_ short_name,提供了不含目錄的程序名稱,即路徑名的基本名稱(basename)部分,定義_GNU_SOURCE宏後即可從<errno.h>中獲得對這兩個全局變量的聲明。

正如圖6-1所示,argv和environ數組,以及這些參數最初指向的字符串,都駐留在進程棧之上的一個單一、連續的內存區域。(下一節將描述environ參數,該參數用於存儲程序的環境列表。)此區域可存儲的字節數有上限要求,SUSv3規定使用ARG_MAX常量(定義於<limits.h>)或者調用sysconf(_SC_ARG_MAX)函數以確定該上限值(將在11.2節描述sysconf()函數),並且SUSv3還要求ARG_MAX常量的下限爲_POSIX_ARG_MAX(4096)個字節,而大多數UNIX實現的限制都遠高於此。但SUSv3並未規定對ARG_MAX限制的實現中是否要將一些開銷字節計算在內(比如終止空字符、字節對齊、argv和environ指針數組)。

Linux中的ARG_MAX參數值曾一度固定爲32個頁面(在Linux/x86-32中即爲131072個字節),且包含了開銷字節。自內核2.6.23版本開始,可以通過資源限制RLIMIT_STACK來控制argv和environ參數所使用的空間總量上限,在這種情況下,允許argv和environ參數使用的空間上限要比以前大出許多,具體限額爲資源軟限制RLIMIT_ STACK的四分之一,RLIMIT_STACK在調用execve()時已經生效。更多詳細信息請參照execve(2)手冊頁。

許多程序(包括本書中的幾個例子)使用getopt()庫函數解析命令行選項(即以"-"符號開頭的參數)。附錄(Appendix)B將描述getopt()函數。

原文鏈接:6.6 命令行參數(argc, argv)

______________________________________________________________________________________________________________________________________________

VS2008中設置main函數的argv[1]

1.main 函數輸入參數argc argv
 main函數的完全格式是這樣的: 
int   main(int   argc,   char*   argv[],   char*   envp[]) 
下面詳細介紹: 
argc是執行程序時的命令行參數個數。需要注意的是,程序本身的文件也算一個。比如你寫了個程序叫ex,若用下面的命令行啓動: 
ex   /p   /w 
則argc的值爲3。 
argv是命令行中參數的具體值。比如上例,則有 
argv[0]爲 "ex " 
argv[1]爲 "/p " 
argv[2]爲 "/w " 
其實,dos時代的命令行參數就是這樣處理的。 
最後一個envp是環境變量。 
比如path=c:\windows之類的東西。它沒有一個整數來爲它記數,是通過最後一個evnp[i]==NULL來表示結尾的。
argv[]中值是根據空格來判斷的,所以用戶輸入的一個字符串中間不能有空格,否則會被認爲是兩個參數

2.vs2008 執行包含以上形式的main函數,輸入參數設置
右鍵Properties->Debugging->Command Arguments

3.cmd 常用命令
進入某盤符     d:
進入目錄    cd fouder
到上級目錄   cd..   
顯示當前目錄   cd  
執行某程序   path\test.exe

http://www.cnblogs.com/rainbow70626/p/5595454.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章