每個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()函數。
______________________________________________________________________________________________________________________________________________
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