版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、函數(shù)包含類(lèi)別功能_atoldmath.h數(shù)學(xué)子程序把字符串轉(zhuǎn)換為浮點(diǎn)數(shù)beginthreadprocess.h進(jìn)程控制子程序啟動(dòng)執(zhí)行一個(gè)新線程bios diskbios.h接口子程序輸出 BIOS 磁盤(pán)驅(qū)動(dòng)器服務(wù)bios equiplistbios.h接口子程序檢查設(shè)備bios keybrdbios.h接口子程序直接使用 BIOS 的鍵盤(pán)接口bios memsizebiosd.h存儲(chǔ)子程序返回內(nèi)存大小bios printerbios.h接口子程序直接調(diào)用 BIOS 服務(wù)進(jìn)行打印機(jī) I/Obios timeofdaybios.h時(shí)間和日期子程序讀取或設(shè)置 BIOS 時(shí)鐘_biosserialco
2、mbios.h接口子程序進(jìn)行串行 I/O_c_exitprocess.h進(jìn)程控制子程序不終止程序執(zhí)行如同 _exit 的清除_cexitprocess.h進(jìn)程控制子程序不終止程序執(zhí)行如同 _exit 的清除chdrivedirect.h目錄控制子程序設(shè)置當(dāng)前驅(qū)動(dòng)器chian intrdos.h接口子程序chmodeio.h輸入輸出子程序改變文件的存取權(quán)限_clear87float.h數(shù)學(xué)子程序清除浮點(diǎn)狀態(tài)字_closeio.h輸入輸出子程序關(guān)閉文件( 3。 1)以下版本control87float.h數(shù)學(xué)子程序處理浮點(diǎn)控制字creatio.h輸入輸出子程序創(chuàng)建一個(gè)新文件或重寫(xiě)一個(gè)已存在的文件d
3、isabledos.h接口子程序屏蔽中斷_dos_allocmemdos.h存儲(chǔ)子程序_dos_closedos.h輸入輸出子程序關(guān)閉一個(gè)文件dos craetedos.h輸入輸出子程序創(chuàng)建一個(gè)新文件或重寫(xiě)一個(gè)已存在的文件_dos_createnewdos.h輸入輸出子程序創(chuàng)建一個(gè)新文件dos findfirstdos.h目錄控制子程序搜索一個(gè)磁盤(pán)目錄_dos_findnextdos.h目錄控制子程序繼續(xù) _dos_findfirst 的搜索_dos_freememdos.h存儲(chǔ)子程序_dos_getdatedos.h時(shí)間和日期子程序取得和設(shè)置系統(tǒng)日期dos getdiskfredos.h目錄
4、控制子程序取得磁盤(pán)空閑空間dos getdrivedos.h目錄控制子程序取得和設(shè)置當(dāng)前驅(qū)動(dòng)器號(hào)dos getfileattdos.h輸入輸出子程序取得和設(shè)置文件屬性dos getftimedos.h輸入輸出子程序取得和設(shè)置文件日期和時(shí)間_dos_gettimedos.h時(shí)間和日期子程序取得和設(shè)置系統(tǒng)時(shí)間_dos_getvectdos.h接口子程序取得中斷向量_dos_keepdos.h接口子程序dos opendos.h輸入輸出子程序打開(kāi)一個(gè)文件用于讀和寫(xiě)_dos_readdos.h輸入輸出子程序從文件讀_dos_setblockdos.h存儲(chǔ)子程序_dos_setdatedos.h時(shí)間和日
5、期子程序設(shè)置系統(tǒng)日期dos setdrivedos.h目錄控制子程序設(shè)置當(dāng)前驅(qū)動(dòng)器號(hào)dos setfileattdos.h輸入輸出子程序設(shè)置文件屬性_dos_setfitmedos.h_dos_settimedos.h_dos_setvectdos.h_dos_writedos.h_enabledos.h輸入輸出子程序 設(shè)置文件時(shí)間 時(shí)間和日期子程序 設(shè)置系統(tǒng)時(shí)間exitfpresent _fsopen _fullpath_getdcwd_graphfreemem _graphgetmem _harderr _hardresumeprocess.h float.h stdio.h stdlib
6、.h direct.h direct.hgraphics.h graphics.h dos.h dos.h_hardretn dos.h _heapaddalloc.h_heapminmalloc.h_hea 視頻教程 '>pset 塊接口子程序輸入輸出子程序 接口子程序進(jìn)程控制子程序 數(shù)學(xué)子程序輸入輸出子程序 目錄控制子程序目錄控制子程序 目錄控制子程序圖形子程序 圖形子程序 接口子程序 接口子程序接口子程序malloc.h設(shè)置中斷向量寫(xiě)向文件開(kāi)硬件中斷終止程序重新初始化浮點(diǎn)數(shù)學(xué)包把相對(duì)路徑名轉(zhuǎn)換為絕對(duì)路徑名取得指定驅(qū)動(dòng)器的當(dāng)前目錄取得當(dāng)前驅(qū)動(dòng)器號(hào)可修改的圖形內(nèi)存釋放函數(shù)可修改
7、的圖形內(nèi)存分配函數(shù)建立一個(gè)硬件錯(cuò)誤處理程序硬件錯(cuò)誤處理函數(shù)硬件錯(cuò)誤處理函數(shù)添加一個(gè)塊到堆上釋放無(wú)用的堆區(qū)域 用一個(gè)常量值填充堆上的自由_initEasyWin lrotl lrotr_makeepath matherrl matherrl open OvrInitEms OvrInitExt pclose_popen _read rotl rotl rotr searchstr setcursortype setcursortype setcursortype _splitpath _status87 _strdate _strerror _strtimeio.h初始化 Ease window
8、sstdlib.h數(shù)學(xué)子程序?qū)o(wú)符號(hào)長(zhǎng)整型數(shù)向左循環(huán)移位stdlib.h數(shù)學(xué)子程序?qū)o(wú)符號(hào)長(zhǎng)整型數(shù)向右循環(huán)移位stdlib.h目錄控制子程序生成一個(gè)路徑math.h診斷子程序用戶可修改的數(shù)學(xué)錯(cuò)誤處理程序math.h數(shù)學(xué)子程序用戶可修改的數(shù)學(xué)錯(cuò)誤處理程序io.h輸入輸出子程序打開(kāi)一個(gè)文件進(jìn)行讀和寫(xiě)dos.h初始化復(fù)蓋治理程序用于交換 EMS 內(nèi)存dos.h初始化復(fù)蓋治理程序用于交換 EXT 內(nèi)存stdio.h等待一個(gè)管道命令結(jié)束stdio.h創(chuàng)建一個(gè)子命令處理程序管道io.h輸入輸出子程序讀文件( 3。1 以下版本)stdlib.h嵌入子程序?qū)⒁粋€(gè)無(wú)符號(hào)整數(shù)左循環(huán)移位stdlib.h數(shù)學(xué)子程序把
9、一個(gè)無(wú)符號(hào)整數(shù)左循環(huán)移位stdlib.h嵌入子程序?qū)⒁粋€(gè)無(wú)符號(hào)整數(shù)向左循環(huán)移位stdlib.h為某文件查找某些目錄graphics.h圖形子程序選擇光標(biāo)類(lèi)型conio.h輸入輸出子程序選擇光標(biāo)類(lèi)型conio.h文本窗口顯示子程選擇光標(biāo)類(lèi)型stdlib.h目錄控制子程序?qū)⒁粋€(gè)全限定的路徑名分解各個(gè)成份float.h數(shù)學(xué)子程序取浮點(diǎn)狀態(tài)stdlib.h轉(zhuǎn)換子程序把當(dāng)前日期轉(zhuǎn)換成字符串string.h stdio輸入輸出子程序建立用戶定義的錯(cuò)誤信息stdlib.h轉(zhuǎn)換子程序轉(zhuǎn)換當(dāng)前日期為字符串_strtoldstdlib.h轉(zhuǎn)換子程序_strtoldstdlib.h數(shù)學(xué)子程序tolowerctype
10、.h轉(zhuǎn)換子程序把字符轉(zhuǎn)換成小寫(xiě)字母_writeio.h輸入輸出子程序?qū)懳募bortprocess.h進(jìn)程控制子程序異常終止一進(jìn)程absstdlib.h compl數(shù)學(xué)子程序返回整數(shù)的絕對(duì)值abslmath.h數(shù)學(xué)子程序計(jì)算復(fù)數(shù)的模absreaddos.h接口子程序讀磁盤(pán)的絕對(duì)扇區(qū)abswritedos.h接口子程序?qū)懘疟P(pán)的絕對(duì)扇區(qū)accessio.h輸入輸出子程序確定文件的存取權(quán)限acosmath.h complex數(shù)學(xué)子程序計(jì)算反余弦值acoslmath.h數(shù)學(xué)子程序計(jì)算反余弦值allocamalloc.h存儲(chǔ)子程序分配臨時(shí)堆??臻gallocmdos.h存儲(chǔ)子程序分配 DOS 內(nèi)存arcg
11、raphics.h圖形子程序畫(huà)園弧argcomplex.h數(shù)學(xué)子程序求復(fù)平面中一個(gè)復(fù)數(shù)的弧度asctimetime.h時(shí)間和日期子程序 轉(zhuǎn)換日期和時(shí)間為對(duì)應(yīng)的asinmath.h complex數(shù)學(xué)子程序反正弦函數(shù)asinlmath.h數(shù)學(xué)子程序反正弦函數(shù)assertassert.h診斷子程序條件終止函數(shù)atan2math.h complex數(shù)學(xué)子程序計(jì)算 y/x 的反正切值atan2lmath.h數(shù)學(xué)子程序計(jì)算 y/x 的反正切值atofstdlib.h轉(zhuǎn)換子程序?qū)⒆址D(zhuǎn)換為浮點(diǎn)數(shù)at ofmath.h stdlib.數(shù)學(xué)子程序?qū)⒆址D(zhuǎn)換成浮點(diǎn)數(shù)atoistdlib.h轉(zhuǎn)換子程序?qū)⒆址?/p>
12、轉(zhuǎn)換為整數(shù)atoistdlib.h數(shù)學(xué)子程序把字符串轉(zhuǎn)換成整型數(shù)atolstdlib.h轉(zhuǎn)換子程序?qū)⒆帚暣D(zhuǎn)換成長(zhǎng)整型數(shù)atolstdlib.h數(shù)學(xué)子程序抬字符串轉(zhuǎn)換為長(zhǎng)整型bargraphics.h圖形子程序畫(huà)二維條形圖bar3dgraphics.h圖形子程序畫(huà)一個(gè)三維條形圖bcdbcd.h數(shù)學(xué)子程序把一個(gè)數(shù)轉(zhuǎn)換為相對(duì)應(yīng)的bdosdos.h接口子程序DOS 系統(tǒng)調(diào)用bdosptrdos.h接口子程序DOS 系統(tǒng)調(diào)用bioscombios.h接口子程序I/O 通訊biosdiskbios.h接口子程序調(diào)用 BIOS 磁盤(pán)驅(qū)動(dòng)程序bioseqiplistbios.h接口子程序檢查設(shè)備bioske
13、ybios.h接口子程序調(diào)用 BIOS 的鍵盤(pán)接口biosmemorybios.h接口子程序返加內(nèi)存的大小biosprintfbios.h接口子程序調(diào)用 BIOS 的打印 I/O 接口biostimebios.h接口子程序讀取或設(shè)置 BIOS 時(shí)鐘brkalloc.h存儲(chǔ)子程序改變數(shù)據(jù)段內(nèi)存分配cabsmath.h數(shù)學(xué)子程序計(jì)算復(fù)數(shù)的模callocalloc.h stdlib存儲(chǔ)子程序分配內(nèi)存ceilmath.h數(shù)學(xué)子程序舍入ASCII 碼BCD 碼ceillmath.h數(shù)學(xué)子程序舍入cgetsconio.h輸入輸出子程序讀字符串chdirdir.h目錄控制子程序改變當(dāng)前目錄chmodio.h
14、輸入輸出子程序改變文件存取權(quán)限chsizeio.h輸入輸出子程序修改文件長(zhǎng)度circlegraphics.h圖形子程序畫(huà)園cleardevicegraphics.h圖形子程序清圖形屏幕clearerrio.h輸入輸出子程序復(fù)位錯(cuò)誤標(biāo)志clearviewportgraphics.h圖形子程序清除當(dāng)前圖形窗口closeio.h輸入輸出子程序關(guān)閉文件closedirdirect.h目錄控制子程序關(guān)閉目錄流closegraphgraphics.h圖形子程序關(guān)閉圖形系統(tǒng)clreolconio.h文本窗口顯示子程清除從當(dāng)前光標(biāo)位置到行尾的字符clrscrconio.h文本窗口顯示子程清除文本窗口,并把光標(biāo)
15、放在左上角complexcomplex.h數(shù)學(xué)子程序創(chuàng)建復(fù)數(shù)conjcomplex.h數(shù)學(xué)子程序求復(fù)數(shù)的共軛復(fù)數(shù)coreleftalloc.h stdlib存儲(chǔ)子程序 返順未使用的內(nèi)存大小cosmath.h complex 數(shù)學(xué)子程序計(jì)算余弦值coshmath.h complex 數(shù)學(xué)子程序計(jì)算雙曲余弦值coshlmath.h數(shù)學(xué)子程序計(jì)算雙曲余弦值coslmath.h數(shù)學(xué)子程序計(jì)算余弦值countrydos.h接口子程序讀取與特定國(guó)家有關(guān)的格式cprintfconio.h輸入輸出子程序格式化并輸出數(shù)據(jù)到屏幕cputsconio.h輸入輸出子程序輸出一字符串到屏幕creatio.h輸入輸出子程
16、序創(chuàng)建一個(gè)新文件或重寫(xiě)一個(gè)已存在的文件creatnewio.h輸入輸出子程序創(chuàng)建新文件creattempio.h輸入輸出子程序創(chuàng)建一個(gè)文件名唯一的文件cscanfconio.h輸入輸出子程序從控制臺(tái)執(zhí)行格式化輸入ctimetime.h時(shí)間和日期子程序把日期和時(shí)間轉(zhuǎn)化為對(duì)應(yīng)的字符串ctrlbrkdos.h接口子程序設(shè)置 CTRL-BREAK 處理程序delaydos.h雜類(lèi)子程序暫停 DOSdellineconio.h文本窗口顯示子程在文本窗口中刪去一行detectgraphgraphics.h圖形子程序檢測(cè)硬件并確定使用何種圖形驅(qū)運(yùn)程序和圖形difftimetime.h時(shí)間和日期子程序計(jì)算二個(gè)
17、時(shí)刻的時(shí)間差disabledos.h接口子程序屏蔽中斷css.shtml' target'_blank' title ='div 視頻教程 '>divmath.h 數(shù)學(xué)子程序?qū)⒍€(gè)整數(shù)相除,返回商和余數(shù)dosexterrdos.h接口子程序獲取擴(kuò)展錯(cuò)誤信息dostounixdos.h時(shí)間和日期子程序把日期和時(shí)間轉(zhuǎn)換成 UNIX 格式drawpolygraphics.h圖形子程序繪制多邊形dupio.h輸入輸出子程序復(fù)制文件句柄dup2io.h輸入輸出子程序?qū)⒁粋€(gè)文件句柄復(fù)制到一個(gè)已有的文件句柄ecvtstdlib.h轉(zhuǎn)換子程序把浮點(diǎn)數(shù)轉(zhuǎn)換成字符串e
18、cvtstdlib.h數(shù)學(xué)子程序把浮點(diǎn)數(shù)轉(zhuǎn)換為字符串elipsegraphics.h圖形子程序繪制橢園enabledos.h接口子程序開(kāi)硬件中斷eofio.h輸入輸出子程序檢測(cè)文件是否結(jié)束execleprocess.h進(jìn)程控制子程序裝入并運(yùn)行其它程序execlpprocess.h進(jìn)程控制子程序裝入并運(yùn)行其它程序execlpeprocess.h進(jìn)程控制子程序裝入并運(yùn)行其它程序exectprocess.h進(jìn)程控制子程序execvprocess.h進(jìn)程控制子程序裝入并運(yùn)行其它程序本文章來(lái)自21 視頻教程網(wǎng)C 語(yǔ)言編程常見(jiàn)問(wèn)題解答之常用函數(shù)的包含文件(1) _C 語(yǔ)言程序設(shè)計(jì)教程 原文鏈接:C 語(yǔ)言編
19、程常見(jiàn)問(wèn)題解答之雜項(xiàng) (Miscellaneous) ( 2)請(qǐng)參見(jiàn):2012 怎樣把數(shù)據(jù)從一個(gè)程序傳遞到另一個(gè)程序?2017可以使熱啟動(dòng) (Ctrl+Alt+Delete) 失效嗎 ?2110 什么是動(dòng)態(tài)連接 ?20 9 為什么要使用靜態(tài)變量 靜態(tài)變量作為一個(gè)局部變量是很合適的,它在函數(shù)退出后不會(huì)失去其本身的值。例如,有一個(gè) 要被調(diào)用很多次的函數(shù),它的一部分功能就是計(jì)算自己被調(diào)用的次數(shù)。你不能用一個(gè)簡(jiǎn)單的局部變 量來(lái)實(shí)現(xiàn)這部分功能,因?yàn)槊看芜M(jìn)入該函數(shù)時(shí),這個(gè)變量都沒(méi)有被初始化。假如把這個(gè)計(jì)數(shù)變量說(shuō) 明為靜態(tài)的,那么它就會(huì)象一個(gè)全局變量那樣保留自己的當(dāng)前值。那么為什么不直接使用一個(gè)全局變量呢?
20、你可以使用一個(gè)全局變量, 而且這樣做沒(méi)有錯(cuò)誤。 問(wèn)題是使用了大量全局變量的程序維護(hù)起來(lái)很麻煩, 尤其是有許多函數(shù)都各自訪問(wèn)一個(gè)全局變量的程序。 再說(shuō)一遍,這樣做沒(méi)有錯(cuò)誤,這只是一個(gè)程序設(shè)計(jì)和可讀性是否好的問(wèn)題。假如你把這樣的變量說(shuō) 明為靜態(tài)的, 你就可以提醒自己 (或者其它可能讀你的程序的人 )它是局部變量, 但要象全局變量那樣 被處理 (保留自己的值 )。假如你把它說(shuō)明為全局的, 那么讀這個(gè)程序的人一定會(huì)認(rèn)為有很多地方要引 用它,盡管實(shí)際上并不是這樣。總而言之,當(dāng)你需要一個(gè)能保持自己的值的局部變量時(shí),使用靜態(tài)變量是一種好的編程習(xí)慣。請(qǐng)參見(jiàn):2 17 可以頭文件中說(shuō)明 static 變量嗎 ?
21、20 10 怎樣在一個(gè)程序后面運(yùn)行另一個(gè)程序?顯然,在一個(gè)程序后面運(yùn)行另一個(gè)程序的最簡(jiǎn)單的辦法是把它們依次列入一個(gè)批處理文件中, 在執(zhí)行該批處理文件時(shí),其中所列的程序就會(huì)依次運(yùn)行。然而,這是一種人們已經(jīng)知道的辦法。在 c 或 DOS 中,都沒(méi)有一種特定的方法來(lái)完成“在一個(gè)程序結(jié)束后運(yùn)行另一個(gè)程序”這樣一種 函數(shù)調(diào)用。然而, c 提供了兩組函數(shù),它們答應(yīng)一個(gè)程序隨時(shí)可以運(yùn)行另一個(gè)程序,而后者的運(yùn)行 將結(jié)束前者的運(yùn)行。 假如你將這樣的一個(gè)函數(shù)調(diào)用放到第一個(gè)程序的末尾, 你就能達(dá)到上述目的。 C 所提供的這兩組函數(shù)實(shí)際上是由exec()和spawn()所代表的兩個(gè)函數(shù)族,其中的每一個(gè)函數(shù)都具有一種區(qū)
22、別于同族其它函數(shù)的功能。exec()函數(shù)族包括這樣一些成員:execl(), execle(), execlp(), execlpe(),execv(),execve(),execvp()和execvpe()。下面列出了這此函數(shù)名中的e, l,p和v等后綴的含義:e明確地把一個(gè)指向環(huán)境參數(shù)的指針數(shù)組傳遞給子進(jìn)程l把命令參數(shù)逐個(gè)傳遞給要執(zhí)行的程序p通過(guò)環(huán)境變量 PATH 找到要執(zhí)行的文件v把命令行參數(shù)以一個(gè)指針數(shù)組的形式傳遞給要執(zhí)行的程序在程序中選用哪一個(gè)函數(shù)完全取決于你以及要執(zhí)行的程序的需要。下例中的程序調(diào)用了其參數(shù) 由命令行指定的另一個(gè)程序:# include <stdio. h>
23、;# include <process. h> char * envString = "COMM VECTOR=0x63", "PARENT=LAUNCH. EXE", "EXEC=EDIT. COM", NULL ;voidmain(int argc, char *argv)/ * environment for the app * /* communications vector */ * name of this app * / * name of app to exec * / * must be NULL-ter
24、minated * / * Call the one with variable argumets and an enviroffment * /_execvpe (" EDIT. COM", argv, envString ) ;printf("If you can read this sentence, the exec didn't happen!n") ;上面這個(gè)短小的例子調(diào)用 _execvpe()來(lái)執(zhí)行DOS的文件編輯器 EDIT . COM , EDIT程序的參數(shù) 來(lái)自該例的命令行。在調(diào)用execvpe()函數(shù)后,上例中的程序就結(jié)束了
25、;當(dāng) EDIT程序退出時(shí),你將返回到DOS提示符。假如printf()語(yǔ)句的打印內(nèi)容顯示在屏幕上,則說(shuō)明_execvpe()函數(shù)調(diào)用出了問(wèn)題,因?yàn)榧偃缢{(diào)用成功,就不會(huì)有上述結(jié)果。注重,上例所提供的EDIT.COM 的環(huán)境變量是沒(méi)有任何意義的,然而,假如上例要執(zhí)行一個(gè)需要環(huán)境變量的程序,那么所提供的環(huán)境變量就能供該程 序使用了。用spawn()函數(shù)同樣可以完成上例所做的工作。spawn()函數(shù)族包括這樣一些成員:spawnl(), spawnle()。 spawnlp(), spawnlpe(), spawnv(), spawnve(), spawnvp()禾口 spawnvpe()。 這些函
26、數(shù)名中的 e, l, p和v等后綴的含義與 exec()族函數(shù)名中的相同。實(shí)際上,spawn()函數(shù)族與exec()函數(shù)族基本相同,只不過(guò)有一點(diǎn)小小的差別一一spaw n()函數(shù)既可以在結(jié)束原來(lái)的程序后啟動(dòng)另一個(gè)程序,也可以啟動(dòng)另一個(gè)程序并在該程序結(jié)束后返回到原來(lái)的程序。spaw n()函數(shù)的參數(shù)與exec()函數(shù)的基本相同,只不過(guò)需要增加一個(gè)參數(shù)一你必須用_P_OVERLAY(結(jié)束原來(lái)的程序)或_P_WAIT( 結(jié)束后返回到原來(lái)的程序 面的例子相同的工作:)作為spawn()函數(shù)的第一個(gè)參數(shù)。下例用spawn()函數(shù)元成了與前# include <stdio. h># inclu
27、de <process. h>char * envString = "COMM VECTOR = 0x63", "PARENT=LAUNCH. EXE", "EXEC=EDIT. COM" , NULL ;/ * environment for the app * / * communications vector * / * name of this app * / * name of app to exec * / * must be NULL-terminated * /voidmain(int argc, char
28、 *argv)/ * Call the one with variable argumets and an environment * /_spawnvpe (_P_OVERLAY, "EDIT. COM", argv, envString) ;printf("If you can read this sentence, the exec didn't happen!n" );這里唯一的區(qū)別是"exec”變?yōu)?quot;spawn",并且增加了模式(mode)參數(shù)。spawn()函數(shù)有覆蓋和等 待兩種相對(duì)立的功能,它使你可以在
29、spawn()運(yùn)行期間做出是等待還是離開(kāi)的決定。實(shí)現(xiàn)上,P_WAIT參數(shù)回答了下一個(gè)問(wèn)題。請(qǐng)參見(jiàn):2011 怎樣在一個(gè)程序執(zhí)行期間運(yùn)行另一個(gè)程序?2011 怎樣在一個(gè)程序執(zhí)行期間運(yùn)行另一個(gè)程序?正如你在20. 10的例子中看到的那樣,spawn()函數(shù)族答應(yīng)在一個(gè)程序中啟動(dòng)另一個(gè)程序,并 在后者結(jié)束后返回到前者之中。有關(guān)spawn()函數(shù)的背景知識(shí)和例子(你只需把其中的_P_OVERLAY改為 _P_WAIT) 請(qǐng)參見(jiàn) 20. 10。然而,還有另外一種方法可以完成這項(xiàng)工作,即使用system()函數(shù)。system()函數(shù)與exec()或spawn()函數(shù)相似,但也不有同之處。除了掛起(而不是結(jié)
30、束)當(dāng)前程序去執(zhí)行新程序外,system()還要啟動(dòng)COMMAND . COM 命令翻譯程序 (或者其它任何運(yùn)行在你的計(jì)算機(jī)上的命令翻譯程序)。假如它找不到COMMAND .COM或類(lèi)似的程序,那么它就不會(huì)去執(zhí)行所要求的程序(這一點(diǎn)與exec()或spaw n()函數(shù)不同 )。下例是調(diào)用 EDIT COM 打開(kāi)一個(gè)文件的另一個(gè)程 序版本,其中的文件名也來(lái)自該例 的命令行:# include <stdio. h># include <process. h># inclued <stdlib. h>char argStr255 ;voidmain(int arg
31、c, char *argv)int ret ;/ * Have EDIT open a file called HELLO if no arg given * /sprintf (argStr ,"EDIT %s", (argv1 = NULL?"HELLO" :argyll3) ) ;/ * Call the one with variable arguments and an environment * /ret = sytem (argStr) ;printf("system() returned %dn" ,ret) ;與20
32、. 10中的例子一樣(使用_P_WAIT),在system()調(diào)用后面的print()語(yǔ)句會(huì)被執(zhí)行,因?yàn)樵?來(lái)的程序只是被掛起而不是被終止。在每一種情況下,system()都會(huì)返回一個(gè)表示是否成功地運(yùn)行了所指定的程序的值,而不會(huì)返回所指定的程序的返回值。請(qǐng)參見(jiàn):2010 怎樣在一個(gè)程序后面運(yùn)行另一個(gè)程序?2012 怎樣把數(shù)據(jù)從一個(gè)程序傳給另一個(gè)程序步驟都相當(dāng)簡(jiǎn)潔:首先,定義在何處存放數(shù)據(jù),如何獲取數(shù)據(jù),以及如何通知另一個(gè)程序來(lái)獲取或 設(shè)置數(shù)據(jù);然后,你就可以獲取或設(shè)置數(shù)據(jù)了,盡管使用文件的技術(shù)定義和實(shí)現(xiàn)起來(lái)都比較簡(jiǎn)單, 但它的速度往往比較慢 (并且輕易引起混亂 )。因此, 這里重點(diǎn)討論內(nèi)存數(shù)據(jù)
33、轉(zhuǎn)移技術(shù)。下面將依次具體地分析這一過(guò)程的每一個(gè)環(huán)節(jié):定義在何處存放數(shù)據(jù)。當(dāng)你編寫(xiě)要共享數(shù)據(jù)的兩個(gè)程序時(shí),你應(yīng)該讓程序知道要訪問(wèn)的數(shù)據(jù)存 放在何處。這個(gè)環(huán)節(jié)同樣有幾種實(shí)現(xiàn)方法: 你可以在一個(gè) ( 或每個(gè) )程序中建立一個(gè)固定的內(nèi)部緩沖區(qū), 并在兩個(gè)程序之間傳遞指向這個(gè)緩沖區(qū)的指針;你也可以為數(shù)據(jù)分配動(dòng)態(tài)內(nèi)存,并在兩個(gè)程序之間 傳遞指向該數(shù)據(jù)的指針;假如要傳遞的數(shù)據(jù)很小,你還可以通過(guò) CPU 的通用寄存器來(lái)傳遞數(shù)據(jù) (這 種可能性很小,因?yàn)?x86 結(jié)構(gòu)的寄存器很少 )。分配動(dòng)態(tài)內(nèi)存是最靈活和模塊性最強(qiáng)的方法。定義獲取數(shù)據(jù)的方法。這個(gè)環(huán)節(jié)非常簡(jiǎn)潔你可以使用 fmemcpy() 或等價(jià)的內(nèi)存拷貝函數(shù)
34、。 顯然,在獲取和設(shè)置數(shù)據(jù)時(shí)都可以使用這個(gè)函數(shù)。定義通知另一個(gè)程序的方法。因?yàn)?DOS 并不是一個(gè)多任務(wù)操作系統(tǒng),所以其中一個(gè)(或兩個(gè) )程序的一部分必須已經(jīng)駐留在內(nèi)存中,并且可以接受來(lái)自另一個(gè)程序的調(diào)用。同樣,這個(gè)環(huán)節(jié)也有幾 種方法可供選擇:第一個(gè)程序可以是一個(gè)列入 CONFIG SYS 中的驅(qū)動(dòng)程序,它在系統(tǒng)啟動(dòng)時(shí)就被 裝入內(nèi)存;第一個(gè)程序也可以是一個(gè) TSR( 終止并駐留 ) 程序,在它退出時(shí)會(huì)把與第二個(gè)程序相互作 用的那部分程序駐留在內(nèi)存中;此外,你也可以在第一個(gè)程序中利用system()或spawn()函數(shù)(見(jiàn)20.11)來(lái)啟動(dòng)第二個(gè)程序。你可以根據(jù)需要選擇合適的方法。因?yàn)橛嘘P(guān)DOS
35、 驅(qū)動(dòng)程序的數(shù)據(jù)傳遞在 DOS文檔中已經(jīng)有詳盡的描述,而有關(guān)system。和spawn()函數(shù)的內(nèi)容也已經(jīng)在前文中介紹過(guò),因此下面介紹 TSR 方法。下面的例子給出了兩個(gè)程序:第一個(gè)程序是一個(gè)完整的 TSR 程序,但為了突出整個(gè)過(guò)程中的要 害環(huán)節(jié),它寫(xiě)得比較單?。ㄒ?jiàn)20. 15中的解釋)。這個(gè)TSR程序先是安裝了一個(gè)中斷63H的中斷服務(wù)程序,然后調(diào)用終止并駐留退出函數(shù),在執(zhí)行這個(gè) TSR 程序后,執(zhí)行下文給出的另一個(gè)程序。這 個(gè)程序只是簡(jiǎn)單地初始化一個(gè)對(duì)中斷63H的調(diào)用(類(lèi)似于使用中斷21H調(diào)用),并且把“ Hello There ”傳送給上述 TSR 程序# include <stdl
36、ib. h># include <dos. h># include <string. h>void SetupPointers (void) ;void OutputString(char * );# define STACKSIZE4096unsigned int near OldStackPtr; unsigned int near OldStackSeg; unsigned int _near MyStackOff ; unsigned int _near MyStackSeg; unsigned char_near MyStackSTACKSIZE; un
37、signed char far * MyStackPtr= (unsigned char_far * )MyStack; unsigned short AX, BX,CX, DX,ES;/ * My interrupt handler * / void_interrupt_far_ 視頻教程 '>cdecl NewCommVector ( unsigned short es, unsigned short ds, unsigned short di, unsigned short si, unsigned short bp, unsigned short sp, unsigned
38、 short bx, unsigned short dx, unsigned short cx, unsigned short ax, unsigned short ip, unsigned short cs,unsigned short flags) ;/ * Pointers to the previous interrupt handier * / void(_interrupt_far_cdecl * CommVector)(); union REGS regs;struet SREGS segregs ;# define COMM_VECTOR0x63/ * Software int
39、errupt vector * / * This is where the data gets passed into the TSR * / char_far * eallerBufPtr;char localBuffer255; / * Limit of 255 bytes to transfer * / char_far * localBufPtr=(ehar_far * )loealBuffer;unsigned int ProgSize= 276;/ * Size of the program in paragraphs * /voidmain(int argc,char * * a
40、rgv)int i, idx;/ * Set up all far pointers * /SetupPointers () ;/ * Use a cheap hack to see if the TSR is already loadedtf it is, exit,doing nothing * / comm_veetor =_dos_getvect (COMM_VECTOR) ; if(long)eomm_vector & 0xFFFFL) =(long) NewCommVector & OxFFFFL ) ) OutputString("Error :TSR
41、appears to already be loaded. n"); return ;/ * If everything's set,then chain in the TSR * / _dos_setvect (COMM_VECTOR ,NewCommVector) ;/ * Say we are loaded * /OutputString("TSR is now loaded at 0x63n");/ * Terminate, stay resident * / dos_keep (0, ProgSize ) ;/ * Initializes all
42、 the pointers the program will use * /voidSet upPointers ( )int idx ;/ * Save segment and offset of MyStackPtr for stack switching * / MyStackSeg = FP_SEG (MyStackPtr) ;MyStackOff = FP_OFF (MyStackPtr) ;/ * Initialize my stack to hex 55 so I can see its footprintif I need to do debugging * / for (id
43、x = 0 ;idx<STACKSIZE ; idx + ) MyStack idx = 0x55 ;void _interrupt_ far_cdecl NewCommVector (unsigned short es, unsigned short ds, unsigned short di, unsigned short si, unsigned short bp, unsigned short sp, unsigned short bx, unsigned short dx, unsigned short cx, unsigned short ax, unsigned short
44、 ip, unsign ed short cs, unsigned short flags)AX = ax;BX = bx ;CX = cx;DX = dx ;ES = es ;/ * Switch to our stack so we won't run on somebody else's * / _asm ;set up a local stackeli; stop interruptsmovOldStackSeg,ss; save stack segmentmovOldStackPtr,sp; save stack pointer (offset)movax,ds; r
45、eplace with my stack smovss,ax; dittomovax,MyStackOff; replace with my stack saddax,STACKSIZE-2;add in my stack sizemovsp ,ax; dittosti; OK for interrupts againswitch (AX) case 0x10;/ * print string found in ES:BX */ * Copy data from other application locally * / FP_ SEG (callerBufPtr) = ES ; FP_OFF
46、 (callerBufPtr) = BX ; _fstrcpy (localBufPtr, callerBufPtr ) ;/ * print buffer 'CX'number of times * /for(; CX>0; CX-)OutputString (localBufPtr) ; AX=1; /* show success */ break ;case 0x30:/* Unload stop processing interrupts * /_dos_setvect (COMM_VECTOR ,comm_vector) ; AX=2;/* show succe
47、ss */break ;default :OutputString (" Unknown commandrn" ) ;AX= 0xFFFF; / * unknown command-1 * /break ;/ * Switch back to the caller's stack * / asm climovmovsti;turn off interrupts ss,OldStackSeg;reset old stack segmentsp,OldStackPtr ;reset old stack pointer ;back on againax=AX;/* use
48、 return value from switch() */ * avoids calling DOS to print characters * / voidOutputString(char * str)int i ;regs. h. ah = 0x0E ;regs. x. bx = 0 ; for(i=strlen(str) ; i>0; i-,str+)regs. h. al= * str; int86 (0xl0, ?s, ?s) ;上述程序是這兩個(gè)程序中的TSR程序。這個(gè)程序中有一個(gè)NewCommVector()函數(shù),它被安裝在中斷 63H(63H 通常是一個(gè)可用的向量 )處
49、作為中斷服務(wù)程序。 當(dāng)它被安裝好后, 它就可以接收命令了。 switch 語(yǔ)句用來(lái)處理輸入的命令,并作出相應(yīng)的反應(yīng)。筆者隨意選擇了0x1O 和 0x30 來(lái)代表這樣兩條命令:“從 ES:BX 處復(fù)制數(shù)據(jù),并打印到屏幕上, CX 中的數(shù)值為打印次數(shù)” ;“脫離中斷 63H, 并停止接收命令” 。下面是第二個(gè)程序向中斷 63H 發(fā)送命令的程序 (注重它必須在 Large 模式下 編譯 )。# include <stdlib. h># include <dos. h># define COMM VECTOR 0x63union REGS regs;struct SREGS s
50、egregs ;char buffer80;char _far * buf=(char_far *)buffer;main (int argc,char * * argv)intcnt;cnt = (argo= =1 ? 1:atoi(argv1) ;strcpy (bur, "Hello Therern" ) ;regs. x. ax= 0x10;regs. x. cx=cnt ;regs. x. bx=FP OFF(buf);segregs, es=FP SEG(buf) ;int86x(COMM_VECTOR ,?s, &segregs) ;printf (&
51、quot;TSR returned %dn" ,regs. x. ax) ;你可能會(huì)認(rèn)為這個(gè)短小的程序看上去和那些通過(guò)調(diào)用int 21或int 10來(lái)在DOS中設(shè)置或檢索信息的程序差不多。假如你真的這么想,那就對(duì)了。唯一的區(qū)別就是現(xiàn)在你所用的中斷號(hào)是63H,而不是21H或10H。上述程序只是簡(jiǎn)單地調(diào)用前文中的TSR程序,并要求后者把 es: bX所指向的字符串打印到屏幕上,然后,它把中斷處理程序(即那個(gè)TSR程序)的返回值打印到屏幕上。當(dāng)字符串"Hello There ”被打印到屏幕上后,在兩個(gè)程序之間傳遞數(shù)據(jù)的全部必要步驟就都完成 了。這個(gè)例子的真正價(jià)值在于它能夠舉一反三
52、?,F(xiàn)在你能很輕松地編寫(xiě)一個(gè)這樣的程序,它將發(fā)送 一條類(lèi)似于“把要求你打印的最后一個(gè)字符串傳遞給我”的命令。你所要做的就是在前述TSR程序的 switch 語(yǔ)句中加入這條命令,然后再寫(xiě)一個(gè)程序來(lái)發(fā)送這條命令。此外,你也可以在第二個(gè)程序 中利用20. 11中所介紹的system()或spawn()函數(shù)來(lái)啟動(dòng)前述 TSR程序。由于TSR程序會(huì)檢查自己 是否已被裝入,因此你只需裝入一次 TSR 程序,就可以多次運(yùn)行第二個(gè)程序了。在所有要和前述 TSR 程序通信的程序中,你都可以使用這里所說(shuō)的方法。在建立前述 TSR 程序時(shí),需要有幾個(gè)前提條件。其一就是沒(méi)有其它重要的中斷服務(wù)程序也在處 理中斷63H。例
53、如,筆者原來(lái)在程序中使用的是中斷67H,結(jié)果該程序能正常裝入并運(yùn)行,但此后筆者就無(wú)法編譯程序了,因?yàn)镸icrosoft用來(lái)運(yùn)行C編譯程序的DOS擴(kuò)展程序也要使用中斷 67H。在筆者發(fā)送了命令 0x30(讓程序卸載自身)后,編譯程序又能正常運(yùn)行了,因?yàn)镈OS擴(kuò)展程序的中斷處理程序已被該程序恢復(fù)了。第二個(gè)前提條件與駐留檢查在關(guān)。 筆者假設(shè)永遠(yuǎn)不會(huì)有另一個(gè)中斷處理程序使用和 NewCommVector() 相同的近程型地址,盡管這種巧合的可能性極小,但讀者應(yīng)該知道該程序并不是 萬(wàn)無(wú)一失的。在該程序中,筆者特意讓 NewCommVector() 使用自己的棧,以避免它運(yùn)行在調(diào)用它的 程序的棧上,但是,
54、 筆者還是假設(shè)調(diào)用所需的任何函數(shù)都是安全的。注重,該程序沒(méi)有調(diào)用 printf() ,因?yàn)樗加幂^多的內(nèi)存,并且要調(diào)用DOS(int 21)來(lái)打印字符。在該程序中,當(dāng)中斷63H發(fā)生時(shí),筆者不知道DOS是否可以被調(diào)用,因此不能假設(shè)可以使用DOS調(diào)用。注重,在該程序中,可以調(diào)用那些沒(méi)有用到 DOS int21 服務(wù)程序的函數(shù)來(lái)完成所需的任務(wù),假如必 須使用一個(gè) DOS 服務(wù)程序,你可以在中斷 63H 發(fā)生時(shí)檢查 DOS 忙標(biāo)志,以確定當(dāng)時(shí) DOS 是否可 以被調(diào)用。最后,對(duì)dos_keep()作一點(diǎn)說(shuō)明:該函數(shù)要求知道在程序退出時(shí)要在內(nèi)存中保留多少段(每段16字節(jié))數(shù)據(jù)。在本例這個(gè)TSR程序中,提供給該函數(shù)的段數(shù)(276)稍大于整個(gè)可執(zhí)行程序的大小。 當(dāng)你的程序變大時(shí),提供給該函數(shù)的段數(shù)也必須增大,否則就會(huì)出現(xiàn)一些異?,F(xiàn)象。請(qǐng)參見(jiàn):20. 10 怎樣在一個(gè)程序后面運(yùn)行另一個(gè)程序 ?20. 1l 怎樣在一個(gè)程序執(zhí)行期間運(yùn)行另一個(gè)程序 ?20. 15 本書(shū)的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC 15434:2025 EN Information technology - Automatic identification and data capture techniques - Syntax for high-capacity ADC media
- 《單證管理流程》課件
- 《少兒青春期教育》課件
- 單位管理制度集粹選集人員管理
- 《電化學(xué)局部腐蝕》課件
- 單位管理制度合并匯編【員工管理篇】
- 單位管理制度分享合集職工管理篇
- 單位管理制度范例匯編員工管理篇
- 單位管理制度呈現(xiàn)匯編【人力資源管理篇】十篇
- 單位管理制度呈現(xiàn)大全員工管理篇十篇
- 2024年考研(英語(yǔ)一)真題及參考答案
- 《簡(jiǎn)·愛(ài)》-2022年中考一輪復(fù)習(xí)之必讀名著對(duì)比閱讀訓(xùn)練
- 交通燈課程設(shè)計(jì)交通燈控制器
- 單層鋼結(jié)構(gòu)工業(yè)廠房縱向定位軸線的定位
- 腫瘤科常見(jiàn)急重癥
- 03SG715-1蒸壓輕質(zhì)加氣混凝土板(NACL)構(gòu)造詳圖
- 粉體工程第六章粉碎過(guò)程及設(shè)備
- 盡職調(diào)查工作底稿1_公司業(yè)務(wù)調(diào)查
- 洪水計(jì)算(推理公式法)
- 集裝箱碼頭堆場(chǎng)項(xiàng)目可行性研究報(bào)告寫(xiě)作范文
- 醫(yī)保藥店一體化信息管理系統(tǒng)操作手冊(cè)
評(píng)論
0/150
提交評(píng)論