




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Linux系統(tǒng)編程第1單元
UNIX/Linux根底知識(shí)2王凱培訓(xùn)說(shuō)明圍繞Linux系統(tǒng)特性,使用C語(yǔ)言進(jìn)行編程。Linux與Windows下的C語(yǔ)言編程語(yǔ)法相同,只是在涉及系統(tǒng)特性方面有所不同,如文件操作,進(jìn)程操作等。實(shí)驗(yàn)環(huán)境RedHatEnterpriseLinux5,可用VMware虛擬機(jī)。Vi編輯器、GCC編譯器。教材:UNIX環(huán)境高級(jí)編程(第2版)Linux命令資料,驅(qū)動(dòng)程序資料等3培訓(xùn)內(nèi)容第1單元 UNIX/Linux根底知識(shí)第2單元 文件I/O第3單元 文件和目錄第4單元 進(jìn)程環(huán)境第5單元 進(jìn)程控制及進(jìn)程關(guān)系第6單元 信號(hào)第7單元 線程第8單元
守護(hù)進(jìn)程第9單元
進(jìn)程間通信第10單元 網(wǎng)絡(luò)IPC:套接字第11單元 驅(qū)動(dòng)程序原理與開(kāi)發(fā)4第1單元UNIX/Linux根底知識(shí)1.1UNIX/Linux概述1.2Linux開(kāi)發(fā)初步1.3
Linux下C語(yǔ)言開(kāi)發(fā)工具5UNIX概述1969年:KenThompson匯編語(yǔ)言1973年:與DennisRitchie用C語(yǔ)言重寫UNIXⅢUNIX分為SystemV和BSD兩大主流1978年:加利福尼亞大學(xué)伯克利分校以UNIX第六版為根底改進(jìn)成BSD系列UNIX。1983年:SystemV版本1發(fā)布,第一個(gè)商業(yè)UNIX版本SystemV版本4是較成功的,或稱為SVR41992年,版權(quán)糾紛,伯克利分校刪除原UNIX代碼,重寫內(nèi)核,1994年誕生4.4BSD版本,成為現(xiàn)代BSD根本版本。6UNIX體系結(jié)構(gòu)7Linux概述1987年:荷蘭的Vrije大學(xué)的AndrewS.Tanenbaum開(kāi)發(fā)MINIX,用于操作系統(tǒng)課程的教學(xué)。1991年:Linus學(xué)習(xí)MINIX,并發(fā)布Linux內(nèi)核版本0。1994年版本1;1996年版本2;2001年版本2.4;
2003年版本2.6;2023年版本3.0。Linux版本的兩種說(shuō)法內(nèi)核版本:,Linux2.6等:r-主版本號(hào),x-偶數(shù)穩(wěn)定奇數(shù)開(kāi)發(fā),y-錯(cuò)誤修補(bǔ)次數(shù)uname-r查看版本發(fā)行版本:RedHatLinux9.0,SUSE10,Ubuntu等廠家將Linux內(nèi)核與外圍實(shí)用程序和文檔包裝,提供安裝界面和系統(tǒng)配置、管理工具等,形成的操作系統(tǒng)。8Linux概述Linux特點(diǎn)優(yōu)點(diǎn)內(nèi)核免費(fèi)使用開(kāi)放性、多用戶、多任務(wù)、用戶界面、設(shè)備獨(dú)立性、豐富的網(wǎng)絡(luò)功能、可靠的系統(tǒng)平安、良好的可移植性缺點(diǎn)操作界面不直觀,普通人不容易入門和使用9術(shù)語(yǔ)GNUGNU'sNotUNIX革奴,GNU軟件遵循GPL協(xié)議GPLGeneralPublicLicense通用公共許可,與軟件是否免費(fèi)無(wú)關(guān),只要是自由的ISOCC程序設(shè)計(jì)語(yǔ)言標(biāo)準(zhǔn)POSIXPortableOperatingSystemInterface可移植操作系統(tǒng)接口,正在完善,目的是提高類UNIX環(huán)境下應(yīng)用程序的可移植性。10第1單元UNIX/Linux根底知識(shí)1.1UNIX/Linux概述1.2Linux開(kāi)發(fā)初步1.3
Linux下C語(yǔ)言開(kāi)發(fā)工具11第1單元UNIX/Linux根底知識(shí)1.1UNIX/Linux概述1.2Linux開(kāi)發(fā)初步1.2.1登錄1.2.2文件和目錄1.2.3輸入和輸出1.2.4程序和進(jìn)程出錯(cuò)處理1.2.6用戶標(biāo)識(shí)1.2.7日歷時(shí)間系統(tǒng)調(diào)用和庫(kù)函數(shù)1.3
Linux下C語(yǔ)言開(kāi)發(fā)工具12登錄——登錄名登錄名登錄UNIX系統(tǒng),先輸入登錄名,再輸入口令。用戶信息文件:/etc/passwd登錄名:加密口令:用戶ID:組ID:注釋:家目錄:啟動(dòng)Shell已加密口令文件:/etc/shadow13登錄——ShellShell登錄系統(tǒng)后,用戶可以通過(guò)/etc/inittab文件中的id標(biāo)識(shí)行修改默認(rèn)界面〔字符3、圖形5〕。假設(shè)默認(rèn)字符界面,那么首先顯示一些系統(tǒng)信息,然后啟動(dòng)Shell程序,用戶通過(guò)終端或Shell腳本向Shell輸入命令,Shell去執(zhí)行命令。chsh–l命令查看Shell路徑列表新建用戶時(shí)默認(rèn)的Shell是BASH,GNUShell。有的Shell是鏈接到其他Shell上。14文件和目錄——文件系統(tǒng)文件系統(tǒng)磁盤上文件組織的方法文件系統(tǒng)由目錄和文件組成,層次結(jié)構(gòu)目錄起點(diǎn)稱為根,其名字為字符/目錄本身也是一個(gè)文件,內(nèi)容為多個(gè)目錄項(xiàng),每個(gè)目錄項(xiàng)包含文件的名字及i節(jié)點(diǎn)號(hào)。15文件和目錄——文件系統(tǒng)文件系統(tǒng)16binvarusrtmpsbinlibhomeetcdevbinsrcliblinuxadminlocalX11文件和目錄——文件名和路徑名文件名大小寫區(qū)分,255個(gè)字符合法:字母,數(shù)字,下劃線,減號(hào)不合法:斜線/空格不建議使用:*?$&等不使用后綴決定是否可執(zhí)行;用點(diǎn)開(kāi)頭代表隱藏路徑名一個(gè)或多個(gè)以斜線分隔的文件名序列絕對(duì)路徑名:總是從根目錄開(kāi)始,/usr/src/linux。相對(duì)路徑名:從當(dāng)前目錄/usr開(kāi)始,src/linux。17文件和目錄——工作目錄/起始目錄工作目錄每個(gè)進(jìn)程都有一個(gè)工作目錄,或稱當(dāng)前工作目錄。所有相對(duì)路徑名都從工作目錄開(kāi)始解釋。進(jìn)程可以通過(guò)chdir函數(shù)切換工作目錄shell可以通過(guò)cd命令切換工作目錄起始目錄或稱家目錄或用戶主目錄,是用戶登錄后的工作目錄,在/etc/passwd文件中取得。18輸入和輸出——文件描述符文件描述符非負(fù)整數(shù),內(nèi)核用它來(lái)標(biāo)識(shí)一個(gè)特定進(jìn)程正在訪問(wèn)的文件。翻開(kāi)或創(chuàng)立一個(gè)文件時(shí)被返回,用它可以讀寫關(guān)閉文件。運(yùn)行程序產(chǎn)生新進(jìn)程時(shí),進(jìn)程會(huì)自動(dòng)翻開(kāi)三個(gè)文件得到三個(gè)文件描述符標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤輸出默認(rèn)對(duì)應(yīng)鍵盤、顯示器、顯示器還可以通過(guò)重定向?qū)⒚枋龇匦露ㄏ虻轿募?9輸入和輸出——根本I/O和標(biāo)準(zhǔn)I/O根本I/O不帶緩沖的I/O,UNIX/Linux使用openlseekreadwriteclose標(biāo)準(zhǔn)I/O在根本I/O上參加緩沖,系統(tǒng)自動(dòng)創(chuàng)立緩沖區(qū)fopenfseekfread等f(wàn)write等f(wàn)close緩沖區(qū)類型:全緩沖、行緩沖、無(wú)緩沖默認(rèn):文件讀寫全緩沖、終端讀寫行緩沖,標(biāo)準(zhǔn)錯(cuò)誤輸出無(wú)緩沖??梢允褂胹etvbuf設(shè)置緩沖區(qū)類型??煽缙脚_(tái)移植20程序和進(jìn)程程序存在磁盤上某個(gè)目錄中的可執(zhí)行文件進(jìn)程程序的執(zhí)行實(shí)例,每個(gè)進(jìn)程都有唯一的進(jìn)程IDPID,非負(fù)整數(shù)函數(shù):fork/vfork,exec族,wait/waitpid,exit線程一個(gè)進(jìn)程內(nèi)的多個(gè)執(zhí)行流,共享進(jìn)程地址空間、文件描述符等信息。要注意同步。21出錯(cuò)處理大局部函數(shù)執(zhí)行錯(cuò)誤時(shí),常常返回一個(gè)負(fù)值或者NULL指針,并將全局整型變量errno設(shè)置為含有附加信息的值。在函數(shù)幫助文檔中返回值中會(huì)說(shuō)明此信息errno錯(cuò)誤代碼的值代表不同的錯(cuò)誤信息如要在進(jìn)程中直接訪問(wèn)errno變量,那么需errno.h錯(cuò)誤代碼定義/usr/include/asm-generic/errno-base.h/usr/include/asm-generic/errno.h22出錯(cuò)處理兩條規(guī)那么如果函數(shù)沒(méi)有出錯(cuò),其值不會(huì)被任何一個(gè)函數(shù)去除,僅當(dāng)函數(shù)返回值指明出錯(cuò)時(shí)才根據(jù)需要檢查其值。任一函數(shù)都不會(huì)將errno設(shè)置為0。錯(cuò)誤代碼代表的錯(cuò)誤信息可由strerror和perror函數(shù)輸出。strerror可將參數(shù)指定的錯(cuò)誤代碼輸出錯(cuò)誤信息perror只將全局變量errno的值輸出錯(cuò)誤信息23perrorvoidperror(constchar*msg);功能:顯示當(dāng)前errno對(duì)應(yīng)的錯(cuò)誤信息參數(shù):msg——用戶自定義的提示信息輸出格式“msg:錯(cuò)誤信息〞P11--例1-6testerror.c24perror舉例假設(shè)函數(shù)func執(zhí)行失敗返回-1并設(shè)置錯(cuò)誤代碼為相應(yīng)的值,一般可以這樣使用:intrt;rt=func();if(rt==-1){ perror(“func〞);}這樣一旦func執(zhí)行出錯(cuò),就可以直接看到對(duì)應(yīng)的錯(cuò)誤信息,從而解決錯(cuò)誤。25用戶標(biāo)識(shí)用戶ID——/etc/passwd標(biāo)識(shí)各個(gè)不同的用戶,root用戶0組ID——/etc/group組用于將假設(shè)干用戶分到不同的工程組或部門,允許同組成員共享資源。一般創(chuàng)立用戶時(shí)默認(rèn)創(chuàng)立同名的用戶組,當(dāng)然在創(chuàng)立時(shí)或以后可以修改用戶所屬的用戶組。附加組ID用戶除了屬于某用戶組外,還可以屬于另外的組,一般至少支持16個(gè)附加組。26日歷時(shí)間6.10日歷時(shí)間time_t類型,代表零時(shí)起到現(xiàn)在所經(jīng)過(guò)的秒數(shù)累計(jì)值。時(shí)間轉(zhuǎn)換其他形式〔格式化〕字符串TueJul2309:44:172002或通過(guò)strftime指定的其他格式structtm27日歷時(shí)間structtm{ inttm_sec;[0,61],2秒跳秒
inttm_min;[0,59] inttm_hour;[0,23] inttm_mday;[1,31] inttm_mon;[0,11] inttm_year;yearsince1900 inttm_wday;[0,6] inttm_yday;[0,365]inttm_isdst;夏令時(shí)標(biāo)記
(>0夏令時(shí)有效,0無(wú)效,-1信息不可用)};2829時(shí)間函數(shù)——time#include<time.h>time得到系統(tǒng)當(dāng)前的時(shí)間,time_ttime_ttime(time_t*t);舉例(1)time_tcurt;
curt=time(NULL);(2)time_tcurt;time(&curt);30時(shí)間函數(shù)——localtime#include<time.h>localtime把time_t轉(zhuǎn)換本錢地時(shí)間structtm*localtime(consttime_t*t);舉例:structtm*ptm;time_tcurt;
curt=time(NULL);ptm=localtime(&curt);31時(shí)間函數(shù)——ctime#include<time.h>ctime把time_t轉(zhuǎn)換本錢地時(shí)間字符串char*ctime(consttime_t*t);舉例char*pstrt;time_tcurt;curt=time(NULL);pstrt=ctime(&curt);關(guān)于strftime在6.10中,自行了解 系統(tǒng)調(diào)用與庫(kù)函數(shù)系統(tǒng)調(diào)用操作系統(tǒng)提供給外部程序的接口。庫(kù)函數(shù)C語(yǔ)言庫(kù)函數(shù)提供給C語(yǔ)言編程需要的功能,有的庫(kù)函數(shù)需要調(diào)用系統(tǒng)調(diào)用接口。Linux中有GNU的glibc,POSIX的線程函數(shù)庫(kù)等從用戶角度觀察都以常見(jiàn)的C語(yǔ)言函數(shù)形式出現(xiàn),調(diào)用方法一致。從實(shí)現(xiàn)者角度觀察調(diào)用庫(kù)函數(shù)有的需要內(nèi)核的效勞〔如printf/scanf等〕,有的不需要〔如strcpy/atoi等〕,需要內(nèi)核效勞的庫(kù)函數(shù)是要調(diào)用系統(tǒng)調(diào)用函數(shù)的。調(diào)用系統(tǒng)調(diào)用函數(shù)后執(zhí)行內(nèi)核程序。32系統(tǒng)調(diào)用與庫(kù)函數(shù)33在線文檔on-linemanualpageman常用格式:man數(shù)字查看的主題如:man2open數(shù)字〔小節(jié)〕1命令,2系統(tǒng)調(diào)用,3函數(shù)庫(kù)調(diào)用,5文件格式和約定,
8系統(tǒng)管理命令一般來(lái)說(shuō),命令可以直接使用“man命令〞格式如果命令與函數(shù)名字相同,直接使用man查看的是命令幫助,加上小節(jié)才是函數(shù)幫助。如chmod。34第1單元UNIX/Linux根底知識(shí)1.1UNIX/Linux概述1.2Linux開(kāi)發(fā)初步1.3
Linux下C語(yǔ)言開(kāi)發(fā)工具35第1單元UNIX/Linux根底知識(shí)1.1UNIX/Linux概述1.2Linux開(kāi)發(fā)初步1.3
Linux下C語(yǔ)言開(kāi)發(fā)工具1.3.1
編輯工具〔Vim〕1.3.2
編譯工具〔GCC〕1.3.3
Make工具與Makefile文件1.3.4
調(diào)試方法1.3.5
庫(kù)文件使用與創(chuàng)立1.3.6交叉編譯環(huán)境搭建36Vim的工作模式三種模式插入模式:鍵盤按鍵被當(dāng)作文本命令模式:鍵盤按鍵被當(dāng)作命令底行模式:輸入“:〞“?〞“/〞后進(jìn)入,完成某些功能。37Vim的根本用法啟動(dòng)命令提示符后輸入“vim文件名〞以下所說(shuō)的vim的用法都是在命令模式下,所以在插入模式時(shí)要先Esc退出編輯狀態(tài)。保存不退出:w另存為:w新文件名退出:wq保存并退出:q!不保存退出38Vim的高級(jí)用法文本操作復(fù)制yyywnyynyw剪切dddwnddndw粘貼pP行數(shù)跳轉(zhuǎn)到某行數(shù)字G“:setnu〞顯示行號(hào)“:setnonu〞取消顯示行號(hào)撤銷u重做.搜索/向下?向上下一個(gè)n上一個(gè)N39編譯器——GCCGCC——GNUCCompiler功能強(qiáng)大的編譯器,源代碼到可執(zhí)行文件有4個(gè)步驟:40GCC根本用法根本格式:gcc[選項(xiàng)][源文件名]生成可執(zhí)行文件gcc-o可執(zhí)行文件名源文件名生成目標(biāo)文件gcc-c-o目標(biāo)文件名源文件名要用GDB工具調(diào)試要加-g選項(xiàng)顯示附加的警告信息要加-Wall選項(xiàng)41GCC練習(xí)將hello.c生成hellogcchello.c-ohello將fun.c和main.c編譯生成pro可執(zhí)行文件。gccfun.cmain.c-opro或gcc-oprofun.cmain.c將hello.c生成目標(biāo)文件gcc-chello.c-ohello.o或gcc-c-ohello.ohello.c如果直接返回命令提示符那么編譯無(wú)錯(cuò),使用ls命令查看當(dāng)前目錄下應(yīng)該存在可執(zhí)行文件。如果編譯出錯(cuò),按照提示的文件以及對(duì)應(yīng)行,查找并解決錯(cuò)誤?!睪CC常見(jiàn)錯(cuò)誤解析〕42錯(cuò)誤分類編譯錯(cuò)誤根據(jù)錯(cuò)誤提示找到錯(cuò)誤,從第一個(gè)錯(cuò)誤開(kāi)始解決,解決一個(gè)重新編譯一下。運(yùn)行錯(cuò)誤:編譯正確,運(yùn)行時(shí)錯(cuò)誤調(diào)試器:GDB〔GDB調(diào)試〕打印調(diào)試在程序適當(dāng)位置加printf提示語(yǔ)句〔記得printf中加\n〕在調(diào)用函數(shù)后根據(jù)函數(shù)返回值結(jié)合perror查找錯(cuò)誤43MakeGNUMake是程序自動(dòng)維護(hù)工具在大型的開(kāi)發(fā)工程中,通常有幾十到上百個(gè)的源文件,如果每次均手工鍵入gcc命令進(jìn)行編譯的話,那么會(huì)非常不方便。因此,通常利用make工具來(lái)自動(dòng)完成編譯工作,如:〔1〕僅修改了某幾個(gè)源文件,那么只重新編譯這幾個(gè)源文件;〔2〕如果某個(gè)頭文件被修改了,那么重新編譯所有包含該頭文件的源文件44MakeMake工具通過(guò)make命令調(diào)用makefile文件makefile文件描述源程序之間的相互依賴關(guān)系,主要是有關(guān)一些文件〔目標(biāo)文件〕是從哪些文件〔依賴文件〕中產(chǎn)生,用什么命令來(lái)產(chǎn)生的。調(diào)用格式“make目標(biāo)〞,查找當(dāng)前目錄下makefile文件中指定的目標(biāo),一般都省略目標(biāo)直接用make來(lái)查找makefile文件中的第一個(gè)目標(biāo)?!癿ake-fmakefile文件名〞,調(diào)用指定其他名字的makefile文件。45Makemake命令會(huì)檢查磁盤上的文件,如果目標(biāo)文件不存在或其時(shí)間比它的任一個(gè)依賴文件舊,Make將執(zhí)行相應(yīng)的命令,以便更新目標(biāo)文件。目標(biāo)文件不一定是最后的可執(zhí)行文件,它可以是任何一個(gè)臨時(shí)文件也可以不存在〔偽目標(biāo)〕。46Makefile文件內(nèi)容〔1〕顯式規(guī)那么〔2〕隱含規(guī)那么〔3〕變量定義〔4〕指示符include等〔5〕注釋:#后為注釋,行注釋47顯式規(guī)那么顯式規(guī)那么格式:目標(biāo):依賴[tab]命令注意:[tab]位置按鍵盤上的tab鍵舉例如果hello不存在那么進(jìn)行編譯。如果hello日期沒(méi)有hello.c日期新那么進(jìn)行編譯。48
hello:hello.c gcc–ohellohello.c顯式規(guī)那么一個(gè)工程多個(gè)文件hello:hello.cmain.c gcc–ohellohello.cmain.c通常工程中的文件有很多,如果只是采用此種方法書寫,那么任何一個(gè)文件修改都要重新編譯所有的文件,因此一般都先將源文件生成目標(biāo)文件,然后再將目標(biāo)文件生成可執(zhí)行文件。hello:hello.omain.o gcc-ohellohello.omain.ohello.o:hello.c gcc-c-ohello.ohello.cmain.o:main.c gcc-c-omain.omain.c49顯式規(guī)那么多個(gè)工程如果一個(gè)makefile管理多個(gè)工程,可以分別調(diào)用屢次“make目標(biāo)〞命令來(lái)實(shí)現(xiàn),如果只通過(guò)一次make來(lái)編譯多個(gè)工程,怎么寫呢?all:helloworld以下分別將生成hello和world的過(guò)程寫出這樣make命令執(zhí)行時(shí)將執(zhí)行第一條all規(guī)那么,但不生成all文件,all稱為偽目標(biāo)50顯示規(guī)那么——清空臨時(shí)文件在生成可執(zhí)行文件過(guò)程中可能要生成很多目標(biāo)文件,最好將臨時(shí)的目標(biāo)文件清空,一般在makefile文件結(jié)尾中加一條規(guī)那么clean: rm-f要清空的文件列表這樣可以調(diào)用“makeclean〞命令清空臨時(shí)文件如果要清空的都是.o目標(biāo)文件,可以使用“*.o〞表示。51變量定義變量類似C語(yǔ)言的宏,大小寫敏感$@,$^等都是自動(dòng)化變量$@目標(biāo)文件$^所有依賴文件聲明時(shí)賦初值,使用時(shí)變量名前加$,最好用()將名字括起。如:52OBJ=test.ofun1.ofun2.otest:$(OBJ) gcc–o$@$^變量定義變量定義一方面使得編寫makefile容易,另一方面也能方便修改makefile。嵌入式程序移植到設(shè)備上需要使用交叉編譯器編譯,但是在編寫過(guò)程中是在本地計(jì)算機(jī)上進(jìn)行使用gcc編譯器。而且兩個(gè)編譯器使用的函數(shù)庫(kù)可能也不同。因此可以通過(guò)變量定義設(shè)置編譯器名稱和函數(shù)庫(kù)。53Makefile練習(xí)自行編寫makefile對(duì)于單個(gè)文件的makefile對(duì)于一個(gè)工程多個(gè)文件的makefile對(duì)于多個(gè)工程的makefile文件參考資料:跟我一起寫Makefile54庫(kù)的概念庫(kù)函數(shù),由系統(tǒng)提供的,供程序員開(kāi)發(fā)時(shí)調(diào)用的,完成特定功能的函數(shù)。如printf等,一般是目標(biāo)代碼。便于編程隱藏細(xì)節(jié),降低開(kāi)發(fā)難度和開(kāi)發(fā)周期商業(yè)軟件,保護(hù)知識(shí)產(chǎn)權(quán)存放函數(shù)的文件就像存放函數(shù)的倉(cāng)庫(kù),如Glibc庫(kù),提供了系統(tǒng)調(diào)用和C庫(kù)的根本函數(shù)。Linux下庫(kù)的形式:靜態(tài)庫(kù)、共享庫(kù)。55靜態(tài)庫(kù)和共享庫(kù)靜態(tài)庫(kù)一般以.a結(jié)尾,libtest.a編譯時(shí):庫(kù)函數(shù)所在文件被合并在可執(zhí)行文件中執(zhí)行時(shí):提供可執(zhí)行文件即可可執(zhí)行文件會(huì)變大,適合于小程序調(diào)用。共享庫(kù)一般以.so或.so.x結(jié)尾,x代表版本,如編譯時(shí):庫(kù)文件不被合并入可執(zhí)行文件執(zhí)行時(shí):提供可執(zhí)行文件和庫(kù)文件才能執(zhí)行可執(zhí)行文件會(huì)比較小,并且?guī)讉€(gè)可執(zhí)行文件可以共享庫(kù),適合于大型工程。56準(zhǔn)備源文件創(chuàng)立lib目錄,編寫如下四個(gè)源文件,其中要將fun1和fun2兩個(gè)函數(shù)生成函數(shù)庫(kù),test.c程序調(diào)用函數(shù)庫(kù)的兩個(gè)函數(shù)。57//test.c#include"funs.h"#include"stdio.h"intmain(){printf("intest.cbegin\n");fun1();fun2();printf("intest.cend\n");}//fun1.c#include<stdio.h>voidfun1(){printf("infun1\n");}//fun2.c#include<stdio.h>voidfun2(){printf("infun2\n");}//funs.h#ifndefFUNS_H#defineFUNS_Hvoidfun1();voidfun2();#endif靜態(tài)庫(kù)創(chuàng)立與使用創(chuàng)立靜態(tài)庫(kù)gcc-cfun1.cgcc-cfun2.carrclibfun.afun1.ofun2.o生成靜態(tài)庫(kù)libfun.a使用靜態(tài)庫(kù)在test.c中調(diào)用庫(kù)函數(shù)fun1和fun2gcc-otest_statictest.clibfun.a或gcc-otest_statictest.c-L./-lfun生成的可執(zhí)行文件test_static,可以直接運(yùn)行。58共享庫(kù)創(chuàng)立與使用創(chuàng)立共享庫(kù)gcc–fPIC-cfun1.cgcc–fPIC-cfun2.c-fPIC使輸出按照可重定位地址方式生成。gcc-shared-olibfun.sofun1.ofun2.o生成共享庫(kù)libfun.so使用共享庫(kù)gcc-otest_dynamictest.c–L./–lfun生成可執(zhí)行文件test_dynamiccplibfun.so/usr/lib執(zhí)行59共享庫(kù)的路徑共享庫(kù)默認(rèn)搜索路徑是/usr/lib或/lib,在文件中設(shè)置,對(duì)于自定義庫(kù),需要讓gcc的鏈接器知道庫(kù)的路徑方法一:用戶可以將自定義庫(kù)文件拷貝到默認(rèn)路徑中,或在默認(rèn)路徑中建立符號(hào)鏈接方法二:將自定義庫(kù)路徑參加到文件中并使用ldconfig更新。方法三:使用“l(fā)dconfig絕對(duì)路徑名〞強(qiáng)制搜索某路徑并臨時(shí)參加緩存60嵌入式交叉編譯環(huán)境簡(jiǎn)介交叉開(kāi)發(fā)環(huán)境:宿主機(jī)+調(diào)試通道+目標(biāo)機(jī)“在h上編寫運(yùn)行在o上的程序的問(wèn)題〞在宿主機(jī)編寫程序,使用交叉編譯器編譯。生成可執(zhí)行文件后,將可執(zhí)行文件拷貝至目標(biāo)機(jī)運(yùn)行。通過(guò)調(diào)試通道調(diào)試程序交叉編譯在進(jìn)行嵌入式系統(tǒng)的開(kāi)發(fā)時(shí),運(yùn)行程序的目標(biāo)平臺(tái)通常具有有限的存儲(chǔ)空間和運(yùn)算能力〔如ARM〕,這種情況下,在ARM平臺(tái)上進(jìn)行本機(jī)編譯就不太可能了,這是因?yàn)橐话愕木幾g工具需要很大的存儲(chǔ)空間,并需要很強(qiáng)的CPU運(yùn)算能力。為了解決這個(gè)問(wèn)題,交叉編譯工具就應(yīng)運(yùn)而生了。通過(guò)交叉編譯工具,就可以在CPU能力很強(qiáng)、存儲(chǔ)空間足夠的主機(jī)平臺(tái)上〔比方PC上〕編譯出針對(duì)其他平臺(tái)的可執(zhí)行程序。62交叉編譯器下載下載地址63交叉編譯器安裝1下載交叉編譯器至Linux系統(tǒng)中,如,如放置/home下2解壓縮至/下,會(huì)自動(dòng)在/usr/local/下創(chuàng)立arm目錄tarxzvfcross-3.2.tar.gz-C/3arm-linux-gcc編譯器可執(zhí)行文件在/usr/local/arm/bin下,如要直接調(diào)用需要將該路徑加至PATH中修改文件/etc/profile,參加PATH=$PATH:/usr/local/arm/bin運(yùn)行命令source/etc/profile更新PATH環(huán)境變量64交叉編譯器測(cè)試運(yùn)行arm-linux-gcc-v
命令查看版本自行編寫簡(jiǎn)單的C程序,分別使用gcc和arm-linux-gcc編譯,然后使用file命令查看區(qū)別。gcctest.c-otest_gccarm-linux-gcctest.c-otest_arm65NFS——網(wǎng)絡(luò)文件系統(tǒng)NFS〔NetFileSystem〕NFS效勞可以使網(wǎng)絡(luò)上的同為L(zhǎng)inux或Unix系統(tǒng)主機(jī)共享文件系統(tǒng)。NFS可以將遠(yuǎn)程文件系統(tǒng)載入在本地文件系統(tǒng)下。遠(yuǎn)程的硬盤、目錄和光驅(qū)都可以變本錢地主機(jī)目錄樹(shù)中的一個(gè)子目錄。載入后與處理自己的文件系統(tǒng)一樣使用即可。不只方便,也節(jié)省了重復(fù)保存文件的空間、傳輸文件的時(shí)間及網(wǎng)絡(luò)帶寬。這樣嵌入式設(shè)備可以不用將可執(zhí)行文件拷貝至系統(tǒng)就可以直接執(zhí)行宿主機(jī)上的程序。NFSNFS特點(diǎn)NFS系統(tǒng)是C/S體系結(jié)構(gòu),有效勞器端與客戶端效勞器端提供共享的文件系統(tǒng),必須把文件系統(tǒng)輸出出去客戶端那么要把文件系統(tǒng)載入到自己的系統(tǒng)下使用NFS,需要在效勞器端設(shè)置輸出,在客戶端設(shè)置載入NFS配置過(guò)程N(yùn)FS效勞器端配置(1)配置主機(jī)IP(2)關(guān)閉防火墻(3)配置共享目錄(4)啟動(dòng)NFS效勞NFS客戶端(1)配置客戶端IP(2)掛載共享目錄注意:關(guān)閉防火墻,主機(jī)與客戶端在同一子網(wǎng)內(nèi)NFS效勞器端配置121〕假設(shè)配置IP為子網(wǎng)掩碼2〕關(guān)閉防火墻圖形界面:系統(tǒng)管理平安級(jí)別和防火墻禁用防火墻和SELinuxNFS效勞器端配置33〕配置共享目錄系統(tǒng)管理效勞器設(shè)置nfs點(diǎn)擊添加按鈕NFS效勞器端配置3在添加NFS共享對(duì)話框中設(shè)置三個(gè)頁(yè)。根本:設(shè)置的目錄是已存在而且其他用戶也有適合的權(quán)限,如777一般選項(xiàng):允許更高端口連接sync寫操作用戶訪問(wèn)將遠(yuǎn)程根目錄用戶視為本地根目錄用戶NFS效勞器端配置44〕啟動(dòng)NFS效勞輸入servicenfsstart或servicenfsrestartNFS客戶端配置1〕配置客戶端IP,假設(shè)2〕在客戶端將效勞器目錄掛載到本地mount-tnfs效勞器IP:共享目錄絕對(duì)路徑
客戶端本地目錄如mount-tnfs192.168.0.5:/nfsshare/nfsclient掛載成功后客戶端就可以直接通過(guò)/nfsclient目錄訪問(wèn)效勞器/nfsshare中的文件第1單元小結(jié)Linux系統(tǒng)根本理論Linux編程根本方法編輯器、編譯器、調(diào)試、make、庫(kù)交叉編譯環(huán)境74實(shí)踐實(shí)驗(yàn):練習(xí)Linux根本命令〔文件、目錄、進(jìn)程〕實(shí)驗(yàn):編寫程序分別調(diào)用ctime、localtime、strftime輸出當(dāng)前的日期時(shí)間,時(shí)間格式自定義。實(shí)驗(yàn):編寫Makefile實(shí)驗(yàn):交叉編譯環(huán)境搭建實(shí)驗(yàn):NFS配置75附:Linux根本命令登錄方式〔圖形/字符〕、關(guān)機(jī)文件操作創(chuàng)立、刪除、查看、拷貝、剪切〔移動(dòng)〕、改名、鏈接〔硬/符號(hào)〕、修改權(quán)限、重定向、管道目錄操作創(chuàng)立、刪除、切換、查看文件列表、顯示工作目錄改名、拷貝、剪切〔移動(dòng)〕、符號(hào)鏈接進(jìn)程相關(guān)查看當(dāng)前系統(tǒng)中進(jìn)程結(jié)束某個(gè)、進(jìn)程76Linux登錄與關(guān)機(jī)Linux登錄界面修改/etc/inittab文件,3文本5圖形Linux用戶/etc/passwd保存用戶賬號(hào)信息超級(jí)用戶root、普通用戶用戶切換“su-用戶名〞,用戶名省略即為切換到root,返回用exit命令只有root可以關(guān)機(jī)和重啟關(guān)機(jī):shutdown–hnow或init0重啟:shutdown–rnow或init6文件的權(quán)限多用戶系統(tǒng),用戶都可以遵循路徑名到達(dá)不同的目錄并讀取或執(zhí)行屬于他人的文件。為使用戶保護(hù)自己的文件,以免別人讀取、修改或刪除,用戶可以設(shè)置文件權(quán)限的相應(yīng)位,以便用戶決定誰(shuí)能使用你的文件,誰(shuí)不能。對(duì)于每個(gè)文件,都有四個(gè)不同的用戶root——超級(jí)用戶owner——文件所有者group——文件所在組的成員other——以上三類之外的所有用戶文件的權(quán)限文件的權(quán)限可以通過(guò)ls–l命令查看,只列出非root用戶的讀寫執(zhí)行權(quán)限對(duì)普通文件讀:能夠看文件的內(nèi)容寫:能夠改變和刪除文件的內(nèi)容執(zhí)行:能夠執(zhí)行文件目錄文件讀:
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東省高明實(shí)驗(yàn)中學(xué)高中語(yǔ)文 第四單元 15 陳情表教學(xué)實(shí)錄 粵教版必修5
- 中學(xué)防空教育主題班會(huì)
- 2025年春國(guó)開(kāi)電大《形勢(shì)與政策》形考任務(wù)專題測(cè)試1-5及大作業(yè) (二)
- 酒店保安部工作總結(jié)
- 2025果園土地承包合同
- 2025光伏項(xiàng)目前期總包合同
- 2025奢華別墅裝修施工合同
- 2025年新疆九年級(jí)中考語(yǔ)文一模試卷附答案解析
- 東京店面轉(zhuǎn)讓合同標(biāo)準(zhǔn)文本
- 個(gè)人勞務(wù)維修合同標(biāo)準(zhǔn)文本
- 2025年浙江諸暨市郵政分公司招聘筆試參考題庫(kù)含答案解析
- 電商行業(yè)跨境電商物流服務(wù)質(zhì)量評(píng)價(jià)方案
- 兒童社區(qū)獲得性肺炎管理指南(2024修訂)解讀
- 鄉(xiāng)鎮(zhèn)衛(wèi)生院醫(yī)保管理制度
- 養(yǎng)老院安全隱患排查制度
- 《環(huán)境審計(jì)基本理論》課件
- 升壓站綠色施工方案及記錄
- 冀教版八年級(jí)下冊(cè)英語(yǔ)全冊(cè)教學(xué)設(shè)計(jì)
- 2024北京初三一模語(yǔ)文匯編:非連續(xù)性文本閱讀
- 育嬰師培訓(xùn)材料
- 第十七屆山東省職業(yè)院校技能大賽高職組“動(dòng)物疫病檢疫檢驗(yàn)”賽項(xiàng)規(guī)程
評(píng)論
0/150
提交評(píng)論