真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語(yǔ)言函數(shù)調(diào)用命令行 c語(yǔ)言調(diào)用函數(shù)用法

C語(yǔ)言如何獲得命令行參數(shù)

C語(yǔ)言獲得命令行參數(shù)的方法 每當(dāng)你運(yùn)行一個(gè)DOS或Windows程序時(shí),都會(huì)生成一個(gè)程序段前綴(Program SegmentPrefix,簡(jiǎn)稱PSP)。當(dāng)DOS程序的裝入程序把程序復(fù)制到RAM中來執(zhí)行時(shí),它先把256個(gè)字節(jié)分配給PSP,然后把可執(zhí)行代碼復(fù)制到緊接著PSP的內(nèi)存區(qū)域中。PSP中包含了DOS為了執(zhí)行一個(gè)程序所需要的各種各樣的信息,其中的一部分?jǐn)?shù)據(jù)就是命令行。PSP中偏移量為128的那個(gè)字節(jié)中存放著命令行中的字符個(gè)數(shù),接下來的127個(gè)字節(jié)中存放著命令行本身。這也正是DOS把你能在其提示行中輸入的字符個(gè)數(shù)限制在127個(gè)之內(nèi)的原因——因?yàn)樗鼮槊钚蟹峙涞拇鎯?chǔ)空間只有那么多。遺憾的是,PSP的命令行緩沖區(qū)中并沒有存放可執(zhí)行程序的名字——而只存放著在可執(zhí)行程序名后鍵入的字符(包括空格符)。例如,如果你在DOS提示行中鍵入以下命令: XCOPY AUTOEXEC.BAT AUTOEXEC.BAK 假設(shè)XCOPY.EXE存放在c驅(qū)動(dòng)器的DOS目錄下,則XCOPY.EXE的PSP命令行緩沖區(qū)中將包含以下信息: AUTOEXEC.BAT AUTOEXEC.BAK 注意,命令行中緊接著"XCOPY"的空格符也被復(fù)制到PSP的緩沖區(qū)中。 除了不能在PSP中找到可執(zhí)行程序名外,PSP還有一個(gè)不足之處——在命令行中能看到的對(duì)于輸出或輸入的重定向,在PSP的命令行緩沖區(qū)中是無法看到的,也就是說,你無法從PSP中得知你的程序是否被重定向過。 到現(xiàn)在為止,你應(yīng)該熟悉在C程序中可以通過argc和argv來獲取一些有關(guān)信息,但是,這些信息是怎樣從DOS的裝入程序傳給argv指針的呢?這是由程序的啟動(dòng)代碼來完成的。啟動(dòng)代碼在main()函數(shù)的第一行代碼之前被執(zhí)行,在其執(zhí)行期間,它調(diào)用一個(gè)名為__setargv()的函數(shù),把程序名和命令行從PSP和DOS環(huán)境中復(fù)制到mai‘n()函數(shù)的argv指針?biāo)赶虻木彌_區(qū)中。你可以在xLIBCE.LIB文件中找到_setargv()函數(shù),對(duì)于Small,Medium和Large這三種存儲(chǔ)模式,這里的“x”分別為“S”,“M”和“L”。在生成可執(zhí)行程序時(shí),上述庫(kù)文件會(huì)自動(dòng)被連接進(jìn)來。除了復(fù)制argv參數(shù)的內(nèi)容外,c的啟動(dòng)代碼還要完成其它一些工作。當(dāng)啟動(dòng)代碼執(zhí)行完畢后,main()函數(shù)中的代碼就開始執(zhí)行了。 在DOS中的情況是這樣的,那么在Windows中的情況又是怎樣的呢?實(shí)際上,在Windows中的情況大致上和在DOS中的一樣。當(dāng)執(zhí)行一個(gè)Windows程序時(shí),與DOS的裝入程序一樣,Windows的裝入程序也會(huì)建立一個(gè)PSP,其中包含了與DOS的PSP中相同的信息。主要的區(qū)別是此時(shí)命令行被復(fù)制到lpszCmdLine參數(shù)中,它是WinMain()函數(shù)的參數(shù)表中的第三個(gè)(也是倒數(shù)第二個(gè))參數(shù)。在Windows C的xLIBCEW.LIB庫(kù)文件中包含了啟動(dòng)函數(shù)setargv(),它負(fù)責(zé)把命令行信息復(fù)制到lpszCmdLine緩沖區(qū)中。同樣,這里的“x”也表示程序所使用的存儲(chǔ)模式。在Quick c中,函數(shù)_setargv()包含在庫(kù)文件xLIBCEWQ.LIB中。 盡管DOS程序和Windows程序的命令行信息的管理方式基本相同,但是傳給你的C程序的命令行的格式在安排上稍有不同。在DOS中,啟動(dòng)代碼獲得以空格符為分隔符的命令行后,就把每個(gè)參數(shù)轉(zhuǎn)換為其自身的以NULL為終止符的字符串。因此,你可把a(bǔ)rgv原型化為一個(gè)指針數(shù)組(char* argv[]),并通過從O到n這些下標(biāo)值來訪問每個(gè)參數(shù),其中n等于命令行中的參數(shù)個(gè)數(shù)減去1。你也可以把a(bǔ)rgv原型化為一個(gè)指向指針的指針(char **argv),并通過增減argv的值來訪問每一個(gè)參數(shù)。 在Windows中,傳給c程序的命令行是一個(gè)LPSTR類型或char_far*類型,其中的每一個(gè)參數(shù)都用空格符隔開,就象你在DOS提示行中鍵入這些字符后所看到的那樣(實(shí)際上,在Windows中不可能真正鍵入這些字符,而是通過雙擊應(yīng)用程序圖標(biāo)這樣的方式來啟動(dòng)一個(gè)程序)。為了訪問Windows命令行中的各個(gè)參數(shù),你必須人工地訪問lpszCmdLine所指向的存儲(chǔ)區(qū),并分隔存放在該處的參數(shù),或者使用strtok()這樣的函數(shù),每次處理一個(gè)參數(shù)。 如果你富于探索精神,你可以仔細(xì)地研究PSP本身,并從中獲取命令行信息。為此,你可以像下面這樣來使用DOS中斷21H(此處使用Microsoft C): # include stdio. h # incIude dos. h main(int argc,char **argv){union REGS regs ; / * DOS register access struct * / char far * pspPtr; / * pointer to PSP * / int cmdLineCnt; / *num of chars in cmd line * / regs. h. ah=0x62; /*use DOS interrupt 62 *; int86(0x21 ,regs,egs) ; / *call DOS * / FP-SEG(pspPtr) =regs. x. bx ; / *save PSP segment * / FP_OFF(pspPtr)=0xS0; / * set pointer offset * / / * * pspPtr now points to the command-line count byte * / cmdLineCnt== * pspPtr ; 需要注意的是,在Small存儲(chǔ)模式下,或者在只有一個(gè)代碼段的匯編程序中,由DOS返回到BX寄存器中的值就是程序代碼段的地址值;在Large模式的c程序中,或者在多個(gè)代碼段的匯編程序中,所返回的值是程序中包含PSP的那個(gè)代碼段的段地址值。如果你已經(jīng)建立了一個(gè)指向這個(gè)數(shù)據(jù)的指針,你就可以在程序中使用這個(gè)數(shù)據(jù)了。 今天,通常你可以認(rèn)為你的程序可以使用命令行參數(shù)。但是,在DOS 2.O版以前,存儲(chǔ)在PSP中的命令行信息與現(xiàn)在稍有不同(它不能從命令行中分離出輸入或輸出重定向數(shù)據(jù)),而 且由argv[O]所指向的數(shù)據(jù)中并不一定包含可執(zhí)行程序的路徑名。直到DOS發(fā)展到3.o版,它才提供了(或者說至少公開了)用來檢索PSP的中斷62H。因此,你至少可以認(rèn)為,在運(yùn)行DOS3.0或更高版本的PC上,你的程序總是可以獲得命令行參數(shù)的。 如果你的程序運(yùn)行在DOS 3.0或更高的版本下,你基本上就可以任意處理命令行參數(shù)了,因?yàn)檫@些信息已存入棧中供你使用。顯然,適用于棧中數(shù)據(jù)的常規(guī)的數(shù)據(jù)操作規(guī)則同樣也適用于存入棧中的命令行參數(shù)。然而,如果你的編譯程序不提供argv參數(shù),例如當(dāng)你用匯編語(yǔ)言或者某種不提供argv參數(shù)的編譯程序編寫程序時(shí),真正的問題就出現(xiàn)了。在這種情況下,你將不得不自己找出檢索命令行參數(shù)的方法,而使用DOS中斷62H就是一種很方便的方法。 如果你要用DOS中斷62H來檢索指向命令行的指針,你必須明白該指針?biāo)赶虻臄?shù)據(jù)是供DOS使用的,并且正在被DOS使用。盡管你可以檢索這些數(shù)據(jù),但你不可以改變它們。如果在程序中需要隨時(shí)根據(jù)命令行參數(shù)作出決定,那么在使用這些數(shù)據(jù)之前應(yīng)該先把它們復(fù)制到一個(gè)局部緩沖區(qū)中,這樣就可以隨意處理這些數(shù)據(jù),而不用擔(dān)心會(huì)與DOS發(fā)生沖突了。實(shí)際上,這種技巧同樣適用于帶argv參數(shù)的c程序。位于main()函數(shù)之外的函數(shù)需要使用命令行參數(shù)的情況并不少見,為了使這些函數(shù)能引用這些數(shù)據(jù),main()函數(shù)必須把這些數(shù)據(jù)存為全局型,或者通過(再次)入棧把它們傳遞給需要使用它們的函數(shù)。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了察哈爾右翼中旗免費(fèi)建站歡迎大家使用!

c語(yǔ)言如何調(diào)用命令行并且是以管理員身份運(yùn)行的命令行

如果你的命令要求以管理員身份運(yùn)行,那么你自己的C語(yǔ)言程序也得是以管理員身份運(yùn)行的,這可以通過在程序上點(diǎn)擊 右鍵 -》以管理員權(quán)限運(yùn)行 ,或者通過添加一個(gè) manifest 文件的形式來提升權(quán)限。參見 jingyan.baidu.com/article/f0e83a25c2e78a22e5910137.html 中的步驟1,以外置文件的形式來提升權(quán)限。

C語(yǔ)言使用命令行參數(shù)問題

./test a 3 data

shell程序會(huì)找到test,然后在啟動(dòng)test程序前,把"test" "a" "3" "data"壓入程序的棧中,作為程序啟動(dòng)的參數(shù)。test也就是程序名,一般作為第一個(gè)參數(shù)傳進(jìn)去,所以mian總共收到了4個(gè)參數(shù),此時(shí)argc==4,argv[0]="test",argv[1]="a",argv[2]="3",argv[2]="data"


網(wǎng)站題目:c語(yǔ)言函數(shù)調(diào)用命令行 c語(yǔ)言調(diào)用函數(shù)用法
分享網(wǎng)址:http://weahome.cn/article/dodsops.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部