資源描述:
《使用 getopt() 進(jìn)行命令行處理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、使用getopt()進(jìn)行命令行處理 本文示例源代碼或素材下載 引言 在早期的UNIX®中,其命令行環(huán)境(當(dāng)時(shí)的唯一用戶(hù)界面)包含著數(shù)十種小的文本處理工具。這些工具非常小,通常可很好地完成一項(xiàng)工作。這些工具通過(guò)較長(zhǎng)的命令管道鏈接在一起,前面的程序?qū)⑵漭敵鰝鬟f給下一個(gè)程序以作為輸入,整個(gè)過(guò)程由各種命令行選項(xiàng)和參數(shù)加以控制?! ≌荱NIX的這方面的特征使其成為了極為強(qiáng)大的處理基于本文的數(shù)據(jù)的環(huán)境,而這也是其在公司環(huán)境中的最初用途之一。在命令管道的一端輸入一些文本,然后在另一端檢索經(jīng)過(guò)處理的輸出?! ∶?/p>
2、令行選項(xiàng)和參數(shù)控制UNIX程序,告知它們?nèi)绾蝿?dòng)作。作為開(kāi)發(fā)人員,您要負(fù)責(zé)從傳遞給您程序的main()函數(shù)的命令行發(fā)現(xiàn)用戶(hù)的意圖。本文將演示如何使用標(biāo)準(zhǔn)getopt()和getopt_long()函數(shù)來(lái)簡(jiǎn)化命令行處理工作,并討論了一項(xiàng)用于跟蹤命令行選項(xiàng)的技術(shù)?! ¢_(kāi)始之前 本文包含的示例代碼(請(qǐng)參見(jiàn)下載)是使用C開(kāi)發(fā)工具(CDevelopmentTooling,CDT)在Eclipse3.1中編寫(xiě)的;getopt_demo和getopt_long_demo項(xiàng)目是ManagedMake項(xiàng)目,均使用CDT的程序生成
3、規(guī)則構(gòu)建。在項(xiàng)目中沒(méi)有包含Makefile,如果需要在Eclipse外編譯代碼,可以自己方便地生成一個(gè)?! ∪绻形磭L試過(guò)Eclipse(請(qǐng)參閱參考資料),真的應(yīng)該嘗試一下這是一個(gè)優(yōu)秀的集成開(kāi)發(fā)環(huán)境(integrateddevelopmentenvironment,IDE),其每個(gè)新版本都有較大的提升。這是來(lái)自強(qiáng)硬派EMACS和Makefile開(kāi)發(fā)人員的作品。 命令行 在編寫(xiě)新程序時(shí),首先遇到的障礙之一就是如何處理控制其行為的命令行參數(shù)。這包括從命令行傳遞給您程序的main()函數(shù)的一個(gè)整數(shù)計(jì)數(shù)(通常名為a
4、rgc)和一個(gè)指向字符串的指針數(shù)組(通常名為argv).可以采用兩種實(shí)質(zhì)一樣的方式聲明標(biāo)注main()函數(shù),如清單1中所示?! ∏鍐?.聲明main()函數(shù)的兩種方式intmain(intargc,char*argv[]);intmain(intargc,char**argv); 第一種方式使用的是指向char指針數(shù)組,現(xiàn)在似乎很流行這種方式,比第二種方式(其指針指向多個(gè)指向char的指針)略微清楚一些。由于某些原因,我使用第二種方式的時(shí)間更多一些,這可能源于我在高中時(shí)艱難學(xué)習(xí)C指針的經(jīng)歷。對(duì)于所有的用途和目
5、的,這兩種方法都是一樣的,因此可以使用其中您自己最喜歡的方式?! ‘?dāng)C運(yùn)行時(shí)庫(kù)的程序啟動(dòng)代碼調(diào)用您的main()時(shí),已經(jīng)對(duì)命令行進(jìn)行了處理。argc參數(shù)包含參數(shù)的計(jì)數(shù)值,而argv包含指向這些參數(shù)的指針數(shù)組。對(duì)于C運(yùn)行時(shí)庫(kù),arguments是程序的名稱(chēng),程序名后的任何內(nèi)容都應(yīng)該使用空格加以分隔?! ±纾绻褂脜?shù)-vbar.ibm.運(yùn)行一個(gè)名為foo程序,您的argc將設(shè)置為4,argv的設(shè)置情況將如清單2中所示。 清單2.argv的內(nèi)容argv[0]-fooargv[1]--vargv[2]-bara
6、rgv[3]-.ibm. 一個(gè)程序僅有一組命令行參數(shù),因此我要將此信息存儲(chǔ)在記錄選項(xiàng)和設(shè)置的全局結(jié)構(gòu)中。對(duì)程序有意義的要跟蹤的任何內(nèi)容都可以記錄到此結(jié)構(gòu)中,我將使用結(jié)構(gòu)來(lái)幫助減少全局變量的數(shù)量。正如我在網(wǎng)絡(luò)服務(wù)設(shè)計(jì)文章(請(qǐng)參閱參考資料)所提到的,全局變量非常不適合用于線程化編程中,因此要謹(jǐn)慎使用?! ∈纠a將演示一個(gè)假想的2html程序的命令行處理。該2html程序?qū)⒛撤N類(lèi)型的文檔轉(zhuǎn)換為HTML,具體由用戶(hù)指定的命令行選項(xiàng)控制。它支持以下選項(xiàng): -I不創(chuàng)建關(guān)鍵字索引?! ?llang轉(zhuǎn)換為使用語(yǔ)言代碼la
7、ng指定的語(yǔ)言?! ?ooutfile.html將經(jīng)過(guò)轉(zhuǎn)換的文檔寫(xiě)入到outfile.html,而不是打印到標(biāo)準(zhǔn)輸出?! ?v進(jìn)行轉(zhuǎn)換時(shí)提供詳細(xì)信息;可以多次指定,以提高診斷級(jí)別?! ⑹褂闷渌募Q(chēng)來(lái)作為輸入文檔?! ∧€將支持-h和-?,以打印幫助消息來(lái)提示各個(gè)選項(xiàng)的用途?! 『?jiǎn)單命令行處理:getopt() getopt()函數(shù)位于unistd.h系統(tǒng)頭文件中,其原型如清單3中所示: 清單3.getopt()原型intgetopt(intargc,char*constargv[],constchar
8、*optstring); 給定了命令參數(shù)的數(shù)量(argc)、指向這些參數(shù)的數(shù)組(argv)和選項(xiàng)字符串(optstring)后,getopt()將返回第一個(gè)選項(xiàng),并設(shè)置一些全局變量。使用相同的參數(shù)再次調(diào)用該函數(shù)時(shí),它將返回下一個(gè)選項(xiàng),并設(shè)置相應(yīng)的全局變量。如果不再有識(shí)別到的選項(xiàng),將返回-1,此任務(wù)就完成了?! etopt()所設(shè)置的全局變量包括: optarg指向當(dāng)前選項(xiàng)參數(shù)(如