




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、Linux Linux 環(huán)境下的環(huán)境下的 C C語言編程語言編程第一部分第一部分: : Linux Linux下的下的C C編程實戰(zhàn)之開編程實戰(zhàn)之開發(fā)平臺搭建發(fā)平臺搭建準(zhǔn)備工作準(zhǔn)備工作n建議在建議在PC內(nèi)存足夠大的情況下,不要直接安裝內(nèi)存足夠大的情況下,不要直接安裝Linux操作系統(tǒng),最好把它安裝在運行操作系統(tǒng),最好把它安裝在運行VMWare虛擬機軟件虛擬機軟件的的Windows平臺上,如下圖:平臺上,如下圖: 1. Vim1. Vim和和EmacsEmacs編輯器編輯器n在在Linux平臺下,可用任意一個文本編輯工具編輯源代碼。平臺下,可用任意一個文本編輯工具編輯源代碼。nVim(vi im
2、prove)是)是Linux下功能強大的編輯器,是由下功能強大的編輯器,是由UNIX系統(tǒng)下的傳統(tǒng)文本編輯器系統(tǒng)下的傳統(tǒng)文本編輯器vi發(fā)展而來,是發(fā)展而來,是vi的一個增強的一個增強版本,有彩色和高亮等特性,對編程有很大幫助。主菜單版本,有彩色和高亮等特性,對編程有很大幫助。主菜單-編編程程-vi Improved命令來運行命令來運行x-windows下的下的vim。nEmacs即即Editor MACroS(編輯器宏編輯器宏)的縮寫,是一種強大的的縮寫,是一種強大的文本編輯器,在程序員和其他以技術(shù)工作為主的計算機用戶文本編輯器,在程序員和其他以技術(shù)工作為主的計算機用戶中廣受歡迎。中廣受歡迎。使
3、用使用vimvim編輯編輯helloworldhelloworld程序程序使用使用emacsemacs編輯編輯helloworldhelloworld程序程序2.2.GCC編譯器編譯器nGCC是是Linux平臺下最重要的開發(fā)工具,它是平臺下最重要的開發(fā)工具,它是GNU的的C和和C+編譯器,其基本用法為:編譯器,其基本用法為:ngcc options filenames 該命令按編譯選項(參數(shù)該命令按編譯選項(參數(shù)options)指定的操作對給)指定的操作對給定的文件進行編譯處理。定的文件進行編譯處理。n編譯一輸出編譯一輸出“Hello World”的程序:的程序: main() printf(
4、Hello Worldn);2.2.GCC編譯器編譯器n最簡單的編譯方法是不指定任何編譯選項,它會為目標(biāo)最簡單的編譯方法是不指定任何編譯選項,它會為目標(biāo)程序生成默認(rèn)的文件名程序生成默認(rèn)的文件名 a.outgcc o選項:編譯來為將產(chǎn)生的可執(zhí)行文件指定一個文件名。選項:編譯來為將產(chǎn)生的可執(zhí)行文件指定一個文件名。例如,將上述名為例如,將上述名為helloworld.c的的C程序編譯為名叫程序編譯為名叫helloworld的可執(zhí)行文件,輸入如下命令:的可執(zhí)行文件,輸入如下命令:gcc -o helloworld helloworld.c2.2.GCC編譯器編譯器- -常用選項常用選項nc選項:告訴選
5、項:告訴GCC僅把源代碼僅把源代碼(.c文件文件)編譯為目標(biāo)代碼編譯為目標(biāo)代碼(.o文件文件)而跳過匯編和連接的步驟;它能使編譯多個而跳過匯編和連接的步驟;它能使編譯多個C程序時的速度更程序時的速度更快且容易管理。例如用戶將已編輯好的快且容易管理。例如用戶將已編輯好的test.c文件編譯成名為文件編譯成名為test.o的目標(biāo)文件。可以使用命令的目標(biāo)文件。可以使用命令 gcc -c s選項:告訴選項:告訴GCC 在為在為 C代碼產(chǎn)生了匯編語言文件后停止編譯。代碼產(chǎn)生了匯編語言文件后停止編譯。GCC 產(chǎn)生的匯編語言文件的缺省擴展名是產(chǎn)生的匯編語言文件的缺省擴展名是.s。將生成。將生成hellowo
6、rld.c的匯編代碼,使用的是的匯編代碼,使用的是AT&T匯編。用匯編。用emacs打開打開匯編代碼如下圖。匯編代碼如下圖。用用emacs打開的打開的Hello.c的匯編代碼的匯編代碼2.2.GCC編譯器編譯器- -常用選項常用選項nE選項:指示編譯器僅對輸入文件進行預(yù)處理,但不匯編和連接選項:指示編譯器僅對輸入文件進行預(yù)處理,但不匯編和連接nO(-O1)選項:告訴)選項:告訴GCC對源代碼進行基本優(yōu)化從而使得程序?qū)υ创a進行基本優(yōu)化從而使得程序執(zhí)行地更快;而執(zhí)行地更快;而-O2選項告訴選項告訴GCC產(chǎn)生盡可能小和盡可能快的代產(chǎn)生盡可能小和盡可能快的代碼。使用碼。使用-O2選項編譯的速
7、度比使用選項編譯的速度比使用-O時慢,但產(chǎn)生的代碼執(zhí)行時慢,但產(chǎn)生的代碼執(zhí)行速度會更快。速度會更快。nWall 選項:顯示附加的警告信息。例如在上述程序中去掉選項:顯示附加的警告信息。例如在上述程序中去掉 return 0;語句,之后重新編譯語句,之后重新編譯 gcc Wall o hello hello.c將得到的警告信息:將得到的警告信息:hello.c : 5:warning:control reaches end of non-void function3. 3. GDB 調(diào)試器調(diào)試器nGCC用于編譯程序,而用于編譯程序,而Linux的另一個的另一個GNU工具工具gdb則用于調(diào)試程則用
8、于調(diào)試程序。序。gdb是一個用來調(diào)試是一個用來調(diào)試C和和C+程序的強力調(diào)試器,通過它進行程序的強力調(diào)試器,通過它進行一系列調(diào)試工作。一系列調(diào)試工作。ngdb主要提供一下功能主要提供一下功能:n監(jiān)視程序中變量的值得變化監(jiān)視程序中變量的值得變化n設(shè)置斷點,使程序在指定的代碼上暫停執(zhí)行,便于觀察設(shè)置斷點,使程序在指定的代碼上暫停執(zhí)行,便于觀察n單步執(zhí)行代碼單步執(zhí)行代碼n分析崩潰程序產(chǎn)生的分析崩潰程序產(chǎn)生的core文件文件3. 3. GDB 調(diào)試器調(diào)試器ngdb最常用的命令如下最常用的命令如下nfile:裝入想要調(diào)試的可執(zhí)行文件。:裝入想要調(diào)試的可執(zhí)行文件。nkill:終止正在調(diào)試的程序。:終止正在調(diào)
9、試的程序。 nlist:列表顯示源代碼。:列表顯示源代碼。 nnext:執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部。:執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部。 nstep:執(zhí)行一行源代碼而且進入函數(shù)內(nèi)部。:執(zhí)行一行源代碼而且進入函數(shù)內(nèi)部。 nrun:執(zhí)行當(dāng)前被調(diào)試的程序:執(zhí)行當(dāng)前被調(diào)試的程序 nquit:終止:終止gdbnwatch:監(jiān)視一個變量的值:監(jiān)視一個變量的值 nbreak:在代碼里設(shè)置斷點,程序執(zhí)行到這里時掛起:在代碼里設(shè)置斷點,程序執(zhí)行到這里時掛起 3. 3. GDB 調(diào)試器調(diào)試器n舉例說明怎樣用舉例說明怎樣用GDB調(diào)試一個求調(diào)試一個求0+1+2+3+99的程序:的程序:/* Filename:sum
10、.c */main() int i, sum; sum = 0; for (i = 0; i 100; i+) sum + = i; printf(the sum of 1+2+.+ is %d, sum);3. 3. GDB 調(diào)試器調(diào)試器3. 3. GDB 調(diào)試器調(diào)試器n執(zhí)行如下命令編譯執(zhí)行如下命令編譯sum.c(加(加-g選項產(chǎn)生選項產(chǎn)生debug信息):信息): gcc g o sum 在命令行上鍵入在命令行上鍵入gdb sum并按回車鍵就可以開始調(diào)試并按回車鍵就可以開始調(diào)試sum了,了,再運行再運行run命令執(zhí)行命令執(zhí)行sum,屏幕上將看到如下內(nèi)容:,屏幕上將看到如下內(nèi)容: 3. 3.
11、 GDB 調(diào)試器調(diào)試器nlist命令:命令:list命令用于列出源代碼,對上述程序運行命令用于列出源代碼,對上述程序運行l(wèi)ist,將,將出現(xiàn)如下畫面(源代碼被標(biāo)行號):出現(xiàn)如下畫面(源代碼被標(biāo)行號):3. 3. GDB 調(diào)試器調(diào)試器n根據(jù)列出的源程序,如果將斷點設(shè)置在第根據(jù)列出的源程序,如果將斷點設(shè)置在第4行,只需在行,只需在gdb 命令行提示符下鍵入如下命令設(shè)置斷點:命令行提示符下鍵入如下命令設(shè)置斷點:n(gdb)break 4nBreakpoint 1 at 0 x8048338:file sum.c line 4n這時再這時再run,程序會停止在第,程序會停止在第4行:行:nStarti
12、ng program:/root/sumnBreakpoint 1,main() at sum.c line 4n4 sum=03. 3. GDB 調(diào)試器調(diào)試器n設(shè)置斷點的另一種語法是設(shè)置斷點的另一種語法是 break ,它在進入,它在進入指定函數(shù)(指定函數(shù)(function)時停住。)時停住。n相反的,相反的,clear用于清除所有的已定義的斷點用于清除所有的已定義的斷點nclear 清除設(shè)置在函數(shù)上的斷點;清除設(shè)置在函數(shù)上的斷點;nclear 則清除設(shè)置在指定行上的斷點。則清除設(shè)置在指定行上的斷點。3. 3. GDB 調(diào)試器調(diào)試器nwatch命令:用于觀查變量或表達式的值命令:用于觀查變量
13、或表達式的值nwatch命令觀查命令觀查sum變量只需要運行:變量只需要運行:watch sumnwatch命令觀查表達式:命令觀查表達式:watch 為表達式(變量)為表達式(變量)expr設(shè)置一個觀察點,變量表達式值設(shè)置一個觀察點,變量表達式值有變化時,程序會停止執(zhí)行。有變化時,程序會停止執(zhí)行。n要觀查當(dāng)前設(shè)置的要觀查當(dāng)前設(shè)置的watch,可以使用,可以使用info watchpoints命令。命令。3. 3. GDB 調(diào)試器調(diào)試器nnext、step命令:命令:nnext、step用于單步執(zhí)行,在執(zhí)行的過程中,被用于單步執(zhí)行,在執(zhí)行的過程中,被watch變量的變化情況將實時呈現(xiàn)變量的變化
14、情況將實時呈現(xiàn)(分別顯示分別顯示Old value和和New value),如下圖:,如下圖:nnext、step命令的區(qū)別在于命令的區(qū)別在于step遇到函數(shù)調(diào)用,會遇到函數(shù)調(diào)用,會跳轉(zhuǎn)到該函數(shù)定義的開始行去執(zhí)行,而跳轉(zhuǎn)到該函數(shù)定義的開始行去執(zhí)行,而next則不則不進入到函數(shù)內(nèi)部,它把函數(shù)調(diào)用語句當(dāng)作一條普進入到函數(shù)內(nèi)部,它把函數(shù)調(diào)用語句當(dāng)作一條普通語句執(zhí)行。通語句執(zhí)行。4.Make4.Maken編譯和連接的區(qū)別編譯和連接的區(qū)別n編譯器使用源碼文件來產(chǎn)生某種形式的目標(biāo)文件,在編編譯器使用源碼文件來產(chǎn)生某種形式的目標(biāo)文件,在編譯過程中,外部的符號參考并沒有被解釋或替換(即外譯過程中,外部的符號參
15、考并沒有被解釋或替換(即外部全局變量和函數(shù)并沒有被找到)。因此,在編譯階段部全局變量和函數(shù)并沒有被找到)。因此,在編譯階段所報的錯誤一般都是語法錯誤。所報的錯誤一般都是語法錯誤。n連接器則用于連接目標(biāo)文件和程序包,生成一個可執(zhí)行連接器則用于連接目標(biāo)文件和程序包,生成一個可執(zhí)行程序。在連接階段,一個目標(biāo)文件中對別的文件中的符程序。在連接階段,一個目標(biāo)文件中對別的文件中的符號的參考被解釋,如果有符號不能找到,會報告連接錯號的參考被解釋,如果有符號不能找到,會報告連接錯誤。誤。4.Make4.Maken編譯和連接的一般步驟是:編譯和連接的一般步驟是:n第一階段把源文件一個一個的編譯成目標(biāo)文件,第一階
16、段把源文件一個一個的編譯成目標(biāo)文件,n第二階段把所有的目標(biāo)文件加上需要的程序包連接第二階段把所有的目標(biāo)文件加上需要的程序包連接成一個可執(zhí)行文件。成一個可執(zhí)行文件。n這樣的過程需要使用大量的這樣的過程需要使用大量的gcc命令。而命令。而make則使從則使從大量源文件的編譯和連接工作中解放出來,綜合為一大量源文件的編譯和連接工作中解放出來,綜合為一步完成步完成。4.Make4.MakenGNU Make的主要工作是讀進一個文本文件,稱為的主要工作是讀進一個文本文件,稱為makefile。nmakefile文件記錄了哪些文件(目的文件,目的文件文件記錄了哪些文件(目的文件,目的文件不一定是最后的可執(zhí)
17、行程序,它可以是任何一種文件)不一定是最后的可執(zhí)行程序,它可以是任何一種文件)由哪些文件(依靠文件)產(chǎn)生,用什么命令來產(chǎn)生。由哪些文件(依靠文件)產(chǎn)生,用什么命令來產(chǎn)生。nMake依靠此依靠此makefile中的信息檢查磁盤上的文件,如中的信息檢查磁盤上的文件,如果目的文件的創(chuàng)建或修改時間比它的一個依靠文件舊果目的文件的創(chuàng)建或修改時間比它的一個依靠文件舊的話,的話,make就執(zhí)行相應(yīng)的命令,以便更新目的文件。就執(zhí)行相應(yīng)的命令,以便更新目的文件。4.Make4.Makenmakefile文件的編寫文件的編寫nmakefile文件是一個文本文件,用于描述整個項目和各個文件是一個文本文件,用于描述整
18、個項目和各個文件之間的依賴關(guān)系。它由多個規(guī)則組成。文件之間的依賴關(guān)系。它由多個規(guī)則組成。nmakefile文件的規(guī)則遵循以下結(jié)構(gòu)文件的規(guī)則遵循以下結(jié)構(gòu)n#remark 注釋行注釋行ntarget:file1 file2 二進制文件或者目標(biāo)文件二進制文件或者目標(biāo)文件ncommand1 命令命令ncommand2n4.Make4.Maken例如例如: 下面三個文件,下面三個文件,add.h用于聲明用于聲明add函數(shù),函數(shù),add.c提提供兩個整數(shù)相加的函數(shù)體,而供兩個整數(shù)相加的函數(shù)體,而main.c中調(diào)用中調(diào)用add函數(shù):函數(shù): /* filename:add.h */extern int add
19、(int i, int j);/* filename:add.c */int add(int i, int j) return i + j;/* filename:main.c */#include add.hmain() int a, b; a = 2; b = 3; printf(the sum of a+b is %d, add(a + b);怎樣為上述三個文件產(chǎn)生怎樣為上述三個文件產(chǎn)生makefile呢?呢?4.Make4.Maken為上述三個文件產(chǎn)生為上述三個文件產(chǎn)生makefile的方法如下:的方法如下: test : main.o add.o gcc main.o add.o -
20、o test main.o : main.c add.h gcc -c main.c -o main.o add.o : add.c add.h gcc -c add.c -o add.o 4.Make4.Maken上述上述makefile文件的含義文件的含義n利用利用add.c和和add.h文件執(zhí)行文件執(zhí)行g(shù)cc -c add.c -o add.o命令產(chǎn)生命令產(chǎn)生add.o目標(biāo)代碼。目標(biāo)代碼。n利用利用main.c和和add.h文件執(zhí)行文件執(zhí)行g(shù)cc -c main.c -o main.o命令命令產(chǎn)生產(chǎn)生main.o目標(biāo)代碼。目標(biāo)代碼。n最后利用最后利用main.o和和add.o文件(兩個模
21、塊的目標(biāo)代碼)執(zhí)文件(兩個模塊的目標(biāo)代碼)執(zhí)行行g(shù)cc main.o add.o -o test命令產(chǎn)生可執(zhí)行文件命令產(chǎn)生可執(zhí)行文件test。n可以使用可以使用gcc -MM main.c自動尋找源文件中的頭文件,并自動尋找源文件中的頭文件,并形成依賴關(guān)系。形成依賴關(guān)系。n輸出為:輸出為:main.o main.c add.h4.Make4.Maken可在可在makefile中加入變量。另外,環(huán)境變量在中加入變量。另外,環(huán)境變量在make過程中過程中也被解釋成也被解釋成make的變量。這些變量是大小寫敏感的,一般的變量。這些變量是大小寫敏感的,一般使用大寫字母。使用大寫字母。n要定義一個變量,
22、只需要在一行的開始寫下這個變量的名要定義一個變量,只需要在一行的開始寫下這個變量的名字,后面跟一個字,后面跟一個=號,再跟變量的值。引用變量的方法是寫號,再跟變量的值。引用變量的方法是寫一個一個$符號,后面跟(變量名)。符號,后面跟(變量名)。4.Make4.Maken把前面的把前面的 makefile 利用變量重寫一遍(并假設(shè)使用利用變量重寫一遍(并假設(shè)使用-Wall -O g編譯選項):編譯選項):nOBJS = main.o add.onCC = gccnCFLAGS = -Wall -O -gntest : $(OBJS)n$(CC) $(OBJS) -o testnmain.o :
23、main.c add.hn$(CC) $(CFLAGS) -c main.c -o main.onadd.o : add.c add.hn$(CC) $(CFLAGS) -c add.c -o add.o 4.Make4.Makenmakefile 中還可定義清除(中還可定義清除(clean)目標(biāo),可用來清除)目標(biāo),可用來清除編譯過程中產(chǎn)生的中間文件,例如在上述編譯過程中產(chǎn)生的中間文件,例如在上述makefile文件文件中添加下列代碼:中添加下列代碼: nclean: rm -f *.on運行運行make clean時,將執(zhí)行時,將執(zhí)行rm -f *.o命令,刪除所有編命令,刪除所有編譯過程中
24、產(chǎn)生的中間文件。譯過程中產(chǎn)生的中間文件。4.Make4.MakenMake的運行的運行nGUN make默認(rèn)在當(dāng)前的目錄下一次查找默認(rèn)在當(dāng)前的目錄下一次查找GUNmake文件,文件,Makefile文件和文件和makefile文件,文件,找到后讀取文件執(zhí)行。找到后讀取文件執(zhí)行。n給給make命令指定一個特殊名字的命令指定一個特殊名字的makefile文件文件nmake f hchen.mk4.Make4.Maken自己動手編寫自己動手編寫makefile仍然是很復(fù)雜和煩瑣的,而且很仍然是很復(fù)雜和煩瑣的,而且很容易出錯。因此,容易出錯。因此,GNU也提供了也提供了Automake和和Autoco
25、nf來輔助快速自動產(chǎn)生來輔助快速自動產(chǎn)生makefile。4.Make4.Maken使用使用autoconf和和automake來進行自動化配置和生成來進行自動化配置和生成Makefile的流程可以概括如下:的流程可以概括如下:n運行運行autoscan命令。命令。n將將configure.scan文件重命名為文件重命名為configure.in,并修改,并修改configure.in文件。文件。n運行運行aclocal命令得到命令得到aclocal.m4文件。文件。n運行運行autoconf命令得到命令得到configure文件。文件。n在工程目錄下新建在工程目錄下新建Makefile.am
26、文件,如果存在子目錄,文件,如果存在子目錄,子目錄中也要創(chuàng)建此文件。子目錄中也要創(chuàng)建此文件。n將將/usr/share/automake-1.X/目錄下的目錄下的depcomp和和compile文件復(fù)制到需要處理目錄下。文件復(fù)制到需要處理目錄下。n運行運行automake -a命令得到命令得到Makefile.in文件。文件。n運行運行./configure腳本腳本 4.Make4.Maken從例子程序從例子程序helloworld開始。過程如下:開始。過程如下:n新建三個文件:新建三個文件: helloworld.cconfigure.inMakefile.amn然后執(zhí)行然后執(zhí)行 acloc
27、al; autoconf; automake -add-missing; ./configure; make; ./helloworld nMakefile被產(chǎn)生出來,而且可以將被產(chǎn)生出來,而且可以將helloworld.c編譯通編譯通過。過。小結(jié)小結(jié)n本部分主要闡述了本部分主要闡述了Linux程序的編寫、編譯、調(diào)試方程序的編寫、編譯、調(diào)試方法及法及make,實際上是引導(dǎo)學(xué)習(xí)怎樣在,實際上是引導(dǎo)學(xué)習(xí)怎樣在Linux下編程,下編程,為后續(xù)章節(jié)做好準(zhǔn)備。為后續(xù)章節(jié)做好準(zhǔn)備。第二部分第二部分 LinuxLinux下的下的C C編程實戰(zhàn)之編程實戰(zhàn)之文件系統(tǒng)編程文件系統(tǒng)編程 LinuxLinux平臺下文
28、件編程平臺下文件編程n在在Linux平臺下對文件編程可以使用兩類函數(shù):平臺下對文件編程可以使用兩類函數(shù):nLinux操作系統(tǒng)文件操作系統(tǒng)文件API;nC語言語言I/O庫函數(shù)。庫函數(shù)。 n前者依賴于前者依賴于Linux系統(tǒng)調(diào)用,后者實際上與操作系統(tǒng)是系統(tǒng)調(diào)用,后者實際上與操作系統(tǒng)是獨立的,因為在任何操作系統(tǒng)下,使用獨立的,因為在任何操作系統(tǒng)下,使用C語言語言I/O庫函庫函數(shù)操作文件的方法都是相同的。數(shù)操作文件的方法都是相同的。 1. Linux1. Linux文件文件API-API-創(chuàng)建創(chuàng)建n創(chuàng)建創(chuàng)建nint create(const char *filename, mode_t mode);
29、參數(shù)參數(shù)mode指定新建文件的存取權(quán)限,它同指定新建文件的存取權(quán)限,它同umask一起決定文件的最終權(quán)限(一起決定文件的最終權(quán)限(mode&umask).numask代表了文件在創(chuàng)建時需要去掉的一些存取權(quán)代表了文件在創(chuàng)建時需要去掉的一些存取權(quán)限。限。umask可通過系統(tǒng)調(diào)用可通過系統(tǒng)調(diào)用umask()來改變:來改變: int umask(int newmask); 該調(diào)用將該調(diào)用將umask設(shè)置為設(shè)置為newmask,然后返回舊,然后返回舊的的umask,它只影響讀、寫和執(zhí)行權(quán)限。,它只影響讀、寫和執(zhí)行權(quán)限。1. Linux1. Linux文件文件API-API-創(chuàng)建創(chuàng)建nmode可以
30、是以下情況的組合,可以是以下情況的組合,可以通過上述宏進行可以通過上述宏進行“或或”邏輯產(chǎn)生標(biāo)志。邏輯產(chǎn)生標(biāo)志。 標(biāo)志標(biāo)志含義含義S_IRUSR 用戶可以讀用戶可以讀 S_IWUSR 用戶可以寫用戶可以寫 S_IXUSR 用戶可以執(zhí)行用戶可以執(zhí)行 S_IRWXU 用戶可以讀、寫、執(zhí)行用戶可以讀、寫、執(zhí)行 S_IRGRP 組可以讀組可以讀 S_IWGRP 組可以寫組可以寫S_IXGRP 組可以執(zhí)行組可以執(zhí)行 S_IRWXG 組可以讀寫執(zhí)行組可以讀寫執(zhí)行 1. Linux1. Linux文件文件API-API-創(chuàng)建創(chuàng)建nmode可以是以下情況的組合,可以是以下情況的組合,可以通過上述宏進行可以通過
31、上述宏進行“或或”邏輯產(chǎn)生標(biāo)志。邏輯產(chǎn)生標(biāo)志。標(biāo)志標(biāo)志含義含義S_IROTH其他人可以讀其他人可以讀S_IWOTH其他人可以寫其他人可以寫S_IXOTH其他人可以執(zhí)行其他人可以執(zhí)行S_IRWXO其他人可以讀、寫、執(zhí)行其他人可以讀、寫、執(zhí)行S_ISUID設(shè)置用戶執(zhí)行設(shè)置用戶執(zhí)行IDS_ISGID設(shè)置組的執(zhí)行設(shè)置組的執(zhí)行ID1. Linux1. Linux文件文件API-API-創(chuàng)建創(chuàng)建n用數(shù)字來表示:用數(shù)字來表示:Linux總共用總共用5個數(shù)字來表示文件的各個數(shù)字來表示文件的各種權(quán)限:種權(quán)限:n第一位表示設(shè)置用戶第一位表示設(shè)置用戶ID;n第二位表示設(shè)置組第二位表示設(shè)置組ID;n第三位表示用戶自己
32、的權(quán)限位;第三位表示用戶自己的權(quán)限位;n第四位表示組的權(quán)限;第四位表示組的權(quán)限;n最后一位表示其他人的權(quán)限。每個數(shù)字可以取最后一位表示其他人的權(quán)限。每個數(shù)字可以取1(執(zhí)執(zhí)行權(quán)限行權(quán)限)、2(寫權(quán)限寫權(quán)限)、4(讀權(quán)限讀權(quán)限)、0(無無)或者是這或者是這些值的和。些值的和。1. Linux1. Linux文件文件API-API-創(chuàng)建創(chuàng)建n用數(shù)字來表示:用數(shù)字來表示:n例如,要創(chuàng)建一個用戶可讀、可寫、可執(zhí)行,但是例如,要創(chuàng)建一個用戶可讀、可寫、可執(zhí)行,但是組沒有權(quán)限,其他人可以讀、可以執(zhí)行的文件,并組沒有權(quán)限,其他人可以讀、可以執(zhí)行的文件,并設(shè)置用戶設(shè)置用戶ID位。位。n應(yīng)該使用的模式是應(yīng)該使用的
33、模式是1(設(shè)置用戶設(shè)置用戶ID)、0(不設(shè)置組不設(shè)置組ID)、7(1+2+4,讀、寫、執(zhí)行,讀、寫、執(zhí)行)、0(沒有權(quán)限沒有權(quán)限)、5(1+4,讀、,讀、執(zhí)行執(zhí)行)即即10705 1. Linux1. Linux文件文件API-API-打開打開n打開打開nint open(const char *pathname, int flags);nint open(const char *pathname, int flags, mode_t mode); n如果文件打開成功,如果文件打開成功,open函數(shù)會返回一個文件描述符,函數(shù)會返回一個文件描述符,以后對該文件的所有操作就可以通過對這個文件描述符
34、以后對該文件的所有操作就可以通過對這個文件描述符進行操作來實現(xiàn)。進行操作來實現(xiàn)。nopen函數(shù)有兩個形式,其中函數(shù)有兩個形式,其中pathname是要打開的文件名是要打開的文件名(包含路徑名稱,缺省是認(rèn)為在當(dāng)前路徑下面包含路徑名稱,缺省是認(rèn)為在當(dāng)前路徑下面) 。1. Linux1. Linux文件文件API-API-打開打開n打開打開nflags可以是下面的一個值或者是幾個值的組合,可以是下面的一個值或者是幾個值的組合,O_RDONLY、O_WRONLY、O_RDWR三個標(biāo)志只能三個標(biāo)志只能使用任意的一個使用任意的一個。1. Linux1. Linux文件文件API-API-打開打開n打開打開
35、n如果使用了如果使用了O_CREATE標(biāo)志,則使用的函數(shù)是標(biāo)志,則使用的函數(shù)是int open(const char *pathname,int flags,mode_t mode); 這時這時要指定要指定mode標(biāo)志,用來表示文件的訪問權(quán)限。以標(biāo)志,用來表示文件的訪問權(quán)限。以O(shè)_CREAT為標(biāo)志的為標(biāo)志的open實際上實現(xiàn)了文件創(chuàng)建的功能。實際上實現(xiàn)了文件創(chuàng)建的功能。n例如:例如: open(test, O_CREAT, 10705); open(test, O_CREAT, S_IRWXU | S_IROTH | S_IXOTH | S_ISUID );1. Linux1. Linux文件
36、文件API-API-讀寫讀寫n讀寫讀寫nLinux中提供文件讀寫的系統(tǒng)調(diào)用是中提供文件讀寫的系統(tǒng)調(diào)用是read、write函數(shù):函數(shù): int read(int fd, const void *buf, size_t length); int write(int fd, const void *buf, size_t length);n參數(shù)參數(shù)buf為指向緩沖區(qū)的指針,為指向緩沖區(qū)的指針,length為緩沖區(qū)的大為緩沖區(qū)的大小(以字節(jié)為單位)。小(以字節(jié)為單位)。1. Linux1. Linux文件文件API-API-讀寫讀寫nint read(int fd, const void *buf,
37、 size_t length);n函數(shù)函數(shù)read實現(xiàn)從文件描述符實現(xiàn)從文件描述符fd所指定的文件中讀取所指定的文件中讀取length個字節(jié)到個字節(jié)到buf所指向的緩沖區(qū)中,返回值為實際讀所指向的緩沖區(qū)中,返回值為實際讀取的字節(jié)數(shù)。取的字節(jié)數(shù)。nint write(int fd, const void *buf, size_t length);n函數(shù)函數(shù)write實現(xiàn)將把實現(xiàn)將把length個字節(jié)從個字節(jié)從buf指向的緩沖區(qū)中寫指向的緩沖區(qū)中寫到文件描述符到文件描述符fd所指向的文件中,返回值為實際寫入的所指向的文件中,返回值為實際寫入的字節(jié)數(shù)。字節(jié)數(shù)。1. Linux1. Linux文件文件
38、API-API-定位定位n定位:定位:n對于隨機文件,我們可以隨機的指定位置讀寫,使用如對于隨機文件,我們可以隨機的指定位置讀寫,使用如下函數(shù)進行定位:下函數(shù)進行定位: int lseek(int fd, offset_t offset, int whence);nlseek()將文件讀寫指針相對將文件讀寫指針相對whence移動移動offset個字節(jié)。操個字節(jié)。操作成功時,返回文件指針相對于文件頭的位置。參數(shù)作成功時,返回文件指針相對于文件頭的位置。參數(shù)whence可使用下述值:可使用下述值:nSEEK_SET:相對文件開頭:相對文件開頭nSEEK_CUR:相對文件讀寫指針的當(dāng)前位置:相對文
39、件讀寫指針的當(dāng)前位置nSEEK_END:相對文件末尾:相對文件末尾1. Linux1. Linux文件文件API-API-定位定位n定位:定位:noffset可取負(fù)值,例如下述調(diào)用可將文件指針相對當(dāng)前位可取負(fù)值,例如下述調(diào)用可將文件指針相對當(dāng)前位置向前移動置向前移動5個字節(jié):個字節(jié): lseek(fd, -5, SEEK_CUR);n由于由于lseek函數(shù)的返回值為文件指針相對于文件頭的位置,函數(shù)的返回值為文件指針相對于文件頭的位置,因此下列調(diào)用的返回值就是文件的長度:因此下列調(diào)用的返回值就是文件的長度: lseek(fd, 0, SEEK_END);1. Linux1. Linux文件文件A
40、PI-API-關(guān)閉關(guān)閉n關(guān)閉關(guān)閉n當(dāng)操作完成以后,要關(guān)閉文件,只要調(diào)用當(dāng)操作完成以后,要關(guān)閉文件,只要調(diào)用close即可,即可,其 中其 中 f d 是 要 關(guān) 閉 的 文 件 描 述 符 :是 要 關(guān) 閉 的 文 件 描 述 符 : int close(int fd);1. Linux1. Linux文件文件API-API-編程實例編程實例n例程:編寫一個程序,在當(dāng)前目錄下創(chuàng)建用戶可讀寫例程:編寫一個程序,在當(dāng)前目錄下創(chuàng)建用戶可讀寫文件文件“hello.txt”,在其中寫入,在其中寫入“Hello, software weekly”,關(guān)閉該文件。再次打開該文件,讀取其中的,關(guān)閉該文件。再次打
41、開該文件,讀取其中的內(nèi)容并輸出在屏幕上。內(nèi)容并輸出在屏幕上。n#include /類型類型n#include /獲取文件屬性獲取文件屬性n#include /文件描述詞操作文件描述詞操作n#include #define LENGTH 100nmain()int fd, len;char strLENGTH; fd = open(“hello.txt”, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); /* 創(chuàng)建并打開文件創(chuàng)建并打開文件 ,以讀寫的方式打開,用戶可,以讀寫的方式打開,用戶可以讀、用戶可以寫以讀、用戶可以寫*/1. Linux1. Linux文件文件A
42、PI-API-編程實例編程實例nif (fd) write(fd, Hello, Software Weekly, strlen(Hello, software weekly); /* 寫入寫入Hello, software weekly字符串字符串 */close(fd);nfd = open(“hello.txt”, O_RDWR); /以讀寫方式打開以讀寫方式打開 len = read(fd, str, LENGTH); /* 讀取文件內(nèi)容讀取文件內(nèi)容 */strlen = 0;printf(%sn, str);close(fd); 1. Linux1. Linux文件文件API-API
43、-編程實例編程實例1. Linux1. Linux文件文件API-API-編程實例編程實例n編譯并運行,執(zhí)行結(jié)果如下編譯并運行,執(zhí)行結(jié)果如下nrootdl root#gcc g o hello ./rootdl root# ./hellonHello,software weekly3.C3.C語言庫函數(shù)語言庫函數(shù)nC庫函數(shù)的文件操作實際上是獨立于具體的操作系統(tǒng)庫函數(shù)的文件操作實際上是獨立于具體的操作系統(tǒng)平臺的,不管是在平臺的,不管是在DOS、Windows、Linux還是在還是在VxWorks中都是這些函數(shù)中都是這些函數(shù).3.C3.C語言庫函數(shù)語言庫函數(shù)- -創(chuàng)建和打開創(chuàng)建和打開n創(chuàng)建和打開創(chuàng)
44、建和打開nFILE *fopen(const char *path, const char *mode);nfopen()實現(xiàn)打開指定文件,實現(xiàn)打開指定文件,參數(shù)參數(shù)path字符串包含欲字符串包含欲打開的文件路徑及文件名打開的文件路徑及文件名 ,mode為打開模式為打開模式.n返回值:文件指針名。必須被說明為返回值:文件指針名。必須被說明為FILE類型的指類型的指針變量針變量 。3.C3.C語言庫函數(shù)語言庫函數(shù)- -創(chuàng)建和打開創(chuàng)建和打開nC語言中支持的打開模式如下表,其中語言中支持的打開模式如下表,其中b用于區(qū)分二進制文件用于區(qū)分二進制文件和文本文件,在和文本文件,在DOS、Windows系統(tǒng)
45、中是有區(qū)分的,但系統(tǒng)中是有區(qū)分的,但Linux不區(qū)分二進制文件和文本文件。不區(qū)分二進制文件和文本文件。標(biāo)志標(biāo)志含義含義r, rb以只讀方式打開以只讀方式打開w, wb以只寫方式打開。如果文件不存在,則創(chuàng)建該文件,否以只寫方式打開。如果文件不存在,則創(chuàng)建該文件,否則文件被截斷則文件被截斷a, ab以追加方式打開。如果文件不存在,則創(chuàng)建該文件以追加方式打開。如果文件不存在,則創(chuàng)建該文件r+, r+b, rb+以讀寫方式打開以讀寫方式打開+, w+b, wh+以讀寫方式打開。如果文件不存在時,創(chuàng)建新文件,否以讀寫方式打開。如果文件不存在時,創(chuàng)建新文件,否則文件被截斷則文件被截斷a+, a+b, ab
46、+以讀和追加方式打開。如果文件不存在,創(chuàng)建新文件以讀和追加方式打開。如果文件不存在,創(chuàng)建新文件3.C3.C語言庫函數(shù)語言庫函數(shù)- -讀寫讀寫n讀寫:讀寫:C庫函數(shù)支持以字符、字符串等為單位,支持庫函數(shù)支持以字符、字符串等為單位,支持按照某中格式進行文件的讀寫,這一組函數(shù)為:按照某中格式進行文件的讀寫,這一組函數(shù)為:nint fgetc(FILE *stream); 從流中讀一個字符從流中讀一個字符nint fputc(int c, FILE *stream);送一個字符到流中送一個字符到流中nchar *fgets(char *s, int n, FILE *stream);從流中讀從流中讀取
47、一字符串取一字符串 nint fputs(const char *s, FILE *stream);送一個字符送一個字符串到流中串到流中3.C3.C語言庫函數(shù)語言庫函數(shù)- -讀寫讀寫nint fprintf(FILE *stream, const char *format, .);n傳送格式化輸出到一個文件中,成功時返回轉(zhuǎn)換的傳送格式化輸出到一個文件中,成功時返回轉(zhuǎn)換的字節(jié)數(shù),失敗時返回一個負(fù)數(shù)。字節(jié)數(shù),失敗時返回一個負(fù)數(shù)。 fprintf( stream, %s%c, s, c ); fprintf( stream, %dn, i ); nint fscanf (FILE *stream,
48、const char *format, .);n從一個流中執(zhí)行格式化輸入從一個流中執(zhí)行格式化輸入 if (fscanf(stdin, %d, &i) printf(The integer read was: %dn,i); 3.C3.C語言庫函數(shù)語言庫函數(shù)- -讀寫讀寫n讀寫:讀寫:nsize_t fread(void *ptr, size_t size, size_t n, FILE *stream);nsize_t fwrite (const void *ptr, size_t size, size_t n, FILE *stream);nfread()實現(xiàn)從流實現(xiàn)從流stream
49、中讀取中讀取n個字段,每個字段為個字段,每個字段為size字節(jié),并將讀取的字段放入字節(jié),并將讀取的字段放入ptr所指的字符數(shù)組中,所指的字符數(shù)組中,返回實際已讀取的字段數(shù)。返回實際已讀取的字段數(shù)。nwrite()實現(xiàn)從緩沖區(qū)實現(xiàn)從緩沖區(qū)ptr所指的數(shù)組中把所指的數(shù)組中把n個字段寫到個字段寫到流流stream中,每個字段長為中,每個字段長為size個字節(jié),返回實際寫入個字節(jié),返回實際寫入的字段數(shù)。的字段數(shù)。3.C3.C語言庫函數(shù)語言庫函數(shù)- -定位定位n定位定位 :C庫函數(shù)還提供了讀寫過程中的定位能力,這些函庫函數(shù)還提供了讀寫過程中的定位能力,這些函數(shù)包括:數(shù)包括:nint fgetpos(FI
50、LE *stream, fpos_t *pos); /將文件流的文件位置指示符存儲在將文件流的文件位置指示符存儲在pos變量中變量中nint fsetpos(FILE *stream, const fpos_t *pos);/將文件指針定位在將文件指針定位在pos指定的位置上指定的位置上 n返回值:成功返回返回值:成功返回0,否則返回非,否則返回非0。n#include nvoid main( void )nn FILE *fp;n fpos_t pos;n char buffer50;n if( (fp = fopen( test.txt, rb ) = NULL ) /*以只讀方以只讀方式
51、打開名為式打開名為test.txt的文件的文件*/n printf( Trouble opening filen );n elsen n pos = 10; /*設(shè)置設(shè)置pos值值*/n if( fsetpos( fp, &pos ) != 0 ) /*應(yīng)用應(yīng)用fsetpos函數(shù)將文件指函數(shù)將文件指針針fp按照按照pos指定的位置在文件中定位指定的位置在文件中定位*/n perror( fsetpos error );nelse n /*從新定位的文件指針開始讀取從新定位的文件指針開始讀取16個字符到個字符到buffer緩沖區(qū)緩沖區(qū)*/nfread( buffer, sizeof( c
52、har ), 16, fp );nprintf( 16 bytes at byte %ld: %.16sn, pos, buffer ); /*顯顯示結(jié)果示結(jié)果*/n n n fclose( fp );n 3.C3.C語言庫函數(shù)語言庫函數(shù)- -定位定位n首先,程序以只讀方式打開名為首先,程序以只讀方式打開名為test.txt的文件。在這里,的文件。在這里,test.txt文件中已存入字符串文件中已存入字符串This is a test for testing the function of fsetpos.n將將pos設(shè)置為設(shè)置為10。應(yīng)用。應(yīng)用fsetpos函數(shù)將文件指針函數(shù)將文件指針fp按
53、照按照pos指定的位置在文件中定位。這樣文件指針指定的位置在文件中定位。這樣文件指針fp指向字符串指向字符串中中test的字母的字母t。n再從新定位的文件指針開始讀取再從新定位的文件指針開始讀取16個字符到個字符到buffer緩沖緩沖區(qū),也就是說讀取字符串區(qū),也就是說讀取字符串test for testing到緩沖區(qū)到緩沖區(qū)buffer。n最后顯示結(jié)果:最后顯示結(jié)果:16 bytes at byte 10: test for testing 3.C3.C語言庫函數(shù)語言庫函數(shù)- -定位定位nint fseek(FILE *stream, long offset, int whence);nstr
54、eam為文件指針為文件指針noffset為偏移量,整數(shù)表示正向偏移,負(fù)數(shù)為負(fù)向偏移為偏移量,整數(shù)表示正向偏移,負(fù)數(shù)為負(fù)向偏移nwhence設(shè)定從文件的哪里開始偏移,可能取值為:設(shè)定從文件的哪里開始偏移,可能取值為:nSEEK_SET: 文件開頭文件開頭 0nSEEK_CUR: 當(dāng)前位置當(dāng)前位置 1nSEEK_END: 文件結(jié)尾文件結(jié)尾 2nfseek(fp,100L,0);把把fp指針移動到離文件開頭指針移動到離文件開頭100字節(jié)處;字節(jié)處;nfseek(fp,100L,1);把把fp指針移動到離文件當(dāng)前位置指針移動到離文件當(dāng)前位置100字節(jié)處;字節(jié)處;nfseek(fp,100L,2);把把
55、fp指針退回到離文件結(jié)尾指針退回到離文件結(jié)尾100字節(jié)處。字節(jié)處。3.C3.C語言庫函數(shù)語言庫函數(shù)- -關(guān)閉關(guān)閉n關(guān)閉:關(guān)閉:n利用利用C庫函數(shù)關(guān)閉文件的操作:庫函數(shù)關(guān)閉文件的操作: int fclose (FILE *stream);3.C3.C語言庫函數(shù)語言庫函數(shù)- -編程實例編程實例n例程:編寫一個程序,在當(dāng)前目錄下創(chuàng)建用戶可讀寫例程:編寫一個程序,在當(dāng)前目錄下創(chuàng)建用戶可讀寫文件文件“hello.txt”,在其中寫入,在其中寫入“Hello, software weekly”,關(guān)閉該文件。再次打開該文件,讀取其中的,關(guān)閉該文件。再次打開該文件,讀取其中的內(nèi)容并輸出在屏幕上。內(nèi)容并輸出在屏
56、幕上。n#include #define LENGTH 100nmain()FILE *fd;char strLENGTH;fd = fopen(hello.txt, w+); /* 創(chuàng)建并打開文件創(chuàng)建并打開文件 */if (fd)fputs(Hello, Software Weekly, fd); /* 寫入寫入Hello, software weekly字符串字符串 */fclose(fd);fd = fopen(hello.txt, r);fgets(str, LENGTH, fd); /* 讀取文件內(nèi)容讀取文件內(nèi)容 */printf(%sn, str);fclose(fd);3.3.小
57、結(jié)小結(jié)nLinux提供的虛擬文件系統(tǒng)為多種文件系統(tǒng)提供了統(tǒng)提供的虛擬文件系統(tǒng)為多種文件系統(tǒng)提供了統(tǒng)一的接口,一的接口,Linux的文件編程有兩種途徑:的文件編程有兩種途徑:n基于基于Linux系統(tǒng)調(diào)用;系統(tǒng)調(diào)用;n基于基于C庫函數(shù)庫函數(shù)n這兩種編程所涉及到文件操作有新建、打開、讀寫和這兩種編程所涉及到文件操作有新建、打開、讀寫和關(guān)閉,對隨機文件還可以定位。關(guān)閉,對隨機文件還可以定位。 第二部分第二部分 LinuxLinux下的下的C C編程實戰(zhàn)之進編程實戰(zhàn)之進程控制與進程通信編程程控制與進程通信編程 1. 1.進程的基本進程的基本概念概念n進程是具有一定功能的程序,是關(guān)于一個數(shù)據(jù)集合的一次進程
58、是具有一定功能的程序,是關(guān)于一個數(shù)據(jù)集合的一次執(zhí)行過程。多個進程可以同時運行。執(zhí)行過程。多個進程可以同時運行。nLinux進程在內(nèi)存中包含三部分?jǐn)?shù)據(jù):進程在內(nèi)存中包含三部分?jǐn)?shù)據(jù):n代碼段:存放了程序的代碼,代碼段可以為機器中運行代碼段:存放了程序的代碼,代碼段可以為機器中運行同一程序的數(shù)個進程共享。同一程序的數(shù)個進程共享。n堆棧段:存放的是子程序(函數(shù))的返回地址、子程序堆棧段:存放的是子程序(函數(shù))的返回地址、子程序的參數(shù)及程序的局部變量。的參數(shù)及程序的局部變量。n數(shù)據(jù)段:存放程序的全局變量、常數(shù)以及動態(tài)數(shù)據(jù)分配數(shù)據(jù)段:存放程序的全局變量、常數(shù)以及動態(tài)數(shù)據(jù)分配的數(shù)據(jù)空間。堆棧段和數(shù)據(jù)段不能為
59、運行同一程序的數(shù)的數(shù)據(jù)空間。堆棧段和數(shù)據(jù)段不能為運行同一程序的數(shù)個進程共享。個進程共享。2.2.進程控制進程控制- -進程的創(chuàng)建進程的創(chuàng)建n(1)派生進程)派生進程n系統(tǒng)調(diào)用系統(tǒng)調(diào)用fork用于派生一個進程,其說明如下:用于派生一個進程,其說明如下: #include pid_t fork(void); pid_t vfork(void);n調(diào)用調(diào)用fork時,系統(tǒng)創(chuàng)建一個與當(dāng)前進程(父進程)時,系統(tǒng)創(chuàng)建一個與當(dāng)前進程(父進程)相同的新進程(子進程)。子進程是父進程的一個相同的新進程(子進程)。子進程是父進程的一個復(fù)制,子進程拷貝父進程的數(shù)據(jù)段、代碼段復(fù)制,子進程拷貝父進程的數(shù)據(jù)段、代碼段2.
60、2.進程控制進程控制- -進程的創(chuàng)建進程的創(chuàng)建nfork調(diào)用將執(zhí)行兩次返回,它將從父進程和子進程中調(diào)用將執(zhí)行兩次返回,它將從父進程和子進程中分別返回。分別返回。n從父進程返回時的返回值為子進程的從父進程返回時的返回值為子進程的PID,而從子,而從子進程返回時的返回值為進程返回時的返回值為0,并且返回都將執(zhí)行,并且返回都將執(zhí)行fork之之后的語句。調(diào)用出錯時,返回值為后的語句。調(diào)用出錯時,返回值為-1#include#include#includeint main( ) pid_t pid; pid=fork(); if(pid)0) printf(“fork error!n”); exit(1); else if(pid=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年四川華西第二醫(yī)院招聘臨床護理筆試真題
- 2024年黑河市直招聘公益性崗位就業(yè)人員筆試真題
- 插件化系統(tǒng)性能優(yōu)化-全面剖析
- 失信聯(lián)合懲戒措施適用的法治困境及出路
- 湘鄂渝黔交界區(qū)縣域經(jīng)濟差異及影響因素研究
- 夏季湖羊養(yǎng)殖中不同添加劑應(yīng)用效果研究
- 深度學(xué)習(xí)在混沌分類及光通信中的應(yīng)用研究
- 動態(tài)插畫語言的敘事性研究
- A企業(yè)信息化管理體系建設(shè)研究
- 電子商務(wù)企業(yè)簡介范文
- 短引線保護引出線保護以及T區(qū)保護
- 完美公司瑪麗艷美的觀念
- 浙攝影版(2020)信息技術(shù)三年級上冊第一課認(rèn)識計算機(課件)
- 第七講-信息技術(shù)與大數(shù)據(jù)倫理問題-副本
- 校園安全常識測試題卷
- 建筑用玻璃ccc標(biāo)準(zhǔn)
- 第一課中國人民站起來了
- 眼科門診病歷
- 彝文《指路經(jīng)》課件
- 《神經(jīng)系統(tǒng)的傳導(dǎo)通路》課件
- 基本農(nóng)田劃定技術(shù)規(guī)程(TDT1032-2011)
評論
0/150
提交評論