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