版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 信息技術(shù)學(xué)院</b></p><p> 《嵌入式操作系統(tǒng)》課程</p><p><b> 綜合設(shè)計(jì)報(bào)告書</b></p><p> 姓 名: XX </p><p> 班 級: </p>
2、<p> 學(xué) 號: XXXX </p><p> 題 目: 嵌入式文件鎖應(yīng)用 </p><p> 時(shí) 間: 2012年6月 </p><p> 指導(dǎo)教師: XXX </p><p><b> 摘 要</b></p><
3、;p> 隨著PC時(shí)代的到來,嵌入式系統(tǒng)技術(shù)已經(jīng)成為了一個(gè)萬眾矚目的焦點(diǎn)。目前已廣泛應(yīng)用于信息家電、數(shù)據(jù)網(wǎng)絡(luò)、工業(yè)控制、醫(yī)療衛(wèi)生、航空航天等眾多領(lǐng)域。巨大的市場潛力,無窮的商機(jī),吸引了各路英豪紛蹱踏來。</p><p> 為了解決多個(gè)進(jìn)程并發(fā)訪問同一個(gè)文件時(shí)所面臨的同步問題,Linux采用了文件加鎖技術(shù)。介紹了Linux中各類文件鎖的概念,詳細(xì)分析了與文件鎖密切相關(guān)的系統(tǒng)調(diào)用,并給出了一個(gè)文件鎖的使用實(shí)例
4、。</p><p> 本課程設(shè)計(jì)是以Red Hat linux為基礎(chǔ)平臺,利用fcntl函數(shù)實(shí)現(xiàn)。</p><p> 關(guān)鍵字:Linux 文件鎖 文件描述符 同步問題 并發(fā)訪問 </p><p><b> 目 錄</b></p><p><b> 一、任務(wù)要求4</b></p>
5、;<p><b> 二、設(shè)計(jì)方案4</b></p><p><b> 三、設(shè)計(jì)原理4</b></p><p> 1、函數(shù)產(chǎn)生背景4</p><p> 2、lock( )4</p><p> 3 、fcntl( )5</p><p><b
6、> 四.程序流程圖6</b></p><p><b> 五.VI 簡介6</b></p><p><b> 六.結(jié)果與調(diào)試7</b></p><p><b> 七.總結(jié)8</b></p><p><b> 八.參考文獻(xiàn):9<
7、/b></p><p><b> 附錄:10</b></p><p><b> 一、任務(wù)要求</b></p><p> 在多任務(wù)操作系統(tǒng)環(huán)境中, 如果一個(gè)進(jìn)程嘗試對正在被其他進(jìn)程讀取的文件進(jìn)行寫操作, 可能會導(dǎo)致正在進(jìn)行讀操作的進(jìn)程讀取到一些被破壞或者不完整的數(shù)據(jù); 如果兩個(gè)進(jìn)程并發(fā)對同一個(gè)文件進(jìn)行寫操作,可
8、能會導(dǎo)致該文件遭到破壞。因此, 為了避免發(fā)生這種問題, 必須要采用某種機(jī)制來解決多個(gè)進(jìn)程并發(fā)訪問同一個(gè)文件時(shí)所面臨的同步問題, 由此而產(chǎn)生了文件加鎖方面的技術(shù)。</p><p><b> 二、設(shè)計(jì)方案</b></p><p> 通過編寫在多用戶共享下給文件上鎖的程序,進(jìn)一步熟悉 Linux 中文件 I/O 相關(guān)的應(yīng)用開發(fā),并且熟練的掌握 fcntl()函數(shù)的使用.
9、在文件已經(jīng)共享的情況下如何操作,也就是當(dāng)多個(gè)用戶共同使用,操作一個(gè)文件的情況,這時(shí),Linux 通常采用的方法是給文件上鎖,來避免共享的資源產(chǎn)生競爭的狀態(tài)。</p><p> 文件鎖包括建議性鎖和強(qiáng)制性鎖。建議性鎖要求每個(gè)上鎖文件的進(jìn)程都要檢查是否有鎖存在,并且尊重已有的鎖。在一般情況下,內(nèi)核和系統(tǒng)都不使用建議性鎖。強(qiáng)制性鎖是由內(nèi)核執(zhí)行的鎖,當(dāng)一個(gè)文件被上鎖進(jìn)行寫入操作的時(shí)候,內(nèi)核將阻止其他任何文件對其進(jìn)行讀寫
10、操作。采用強(qiáng)制性鎖對性能的影響很大,每次讀寫操作都必須檢查是否有鎖存在。在 Linux 中,實(shí)現(xiàn)文件上鎖的函數(shù)有 lock 和 fcntl,其中 flock 用于對文件施加建議性鎖, fcntl 不僅可以施加建議性鎖,還可以施加強(qiáng)制鎖。同時(shí), fcntl 還能對文件的某一記錄進(jìn)行上鎖,也就是記錄鎖. </p><p> 記錄鎖又可分為讀取鎖和寫入鎖,其中讀取鎖又稱為共享鎖,它能夠使多個(gè)進(jìn)程都能在文件的同一部分建
11、立讀取鎖。而寫入鎖又稱為排斥鎖,在任何時(shí)刻只能有一個(gè)進(jìn)程在文件的某個(gè)部分上建立寫入鎖。當(dāng)然,在文件的同一部分不能同時(shí)建立讀取鎖和寫入鎖。</p><p><b> 三、設(shè)計(jì)原理</b></p><p><b> 1、函數(shù)產(chǎn)生背景:</b></p><p> 在某文件已經(jīng)共享的情況下,當(dāng)多個(gè)用戶共享使用與操作這個(gè)文件時(shí)
12、,為了避免共享的資源產(chǎn)生競爭的狀態(tài),linux通常采用的方法是給文件上鎖,即文件鎖。在linux中為實(shí)現(xiàn)文件鎖的功能而產(chǎn)生了lock()函數(shù)和fcntl()函數(shù)。</p><p> 2、lock( ) </p><p> Linux 2. 6 內(nèi)核利用系統(tǒng)調(diào)用flock( ) 實(shí)現(xiàn)了共享模式強(qiáng)制鎖, 但flock ( )只能實(shí)現(xiàn)對整個(gè)文件進(jìn)行加鎖,不能實(shí)現(xiàn)記錄級的加鎖,函數(shù)原型如下:
13、</p><p> int flock( int fd, int operat ion) ;</p><p> fd 是需要加鎖的文件的描述符, operation 可以為下列值:</p><p> LOCK_SH: 共享鎖, 多個(gè)進(jìn)程可以同時(shí)擁有對文件的共享鎖。</p><p> LOCK_EX: 互斥鎖, 一個(gè)文件只能上一把互斥鎖
14、。</p><p> LOCK_UN: 解鎖操作。</p><p> LOCK_NB: 如果進(jìn)程不能獲取指定的鎖,函數(shù)將不阻塞,缺省時(shí),進(jìn)程將睡眠等待。</p><p> 這幾個(gè)控制選項(xiàng)可以進(jìn)行組合使用或操作。</p><p> 3 、fcntl( )</p><p> fcntl函數(shù)能復(fù)制一個(gè)現(xiàn)有的描述符、
15、獲得/設(shè)置文件描述符記錄、獲得/設(shè)置文件狀態(tài)標(biāo)志、獲得/設(shè)置異步I/O所有權(quán)以及獲得/設(shè)置記錄鎖。</p><p> 在使用fcntl給文件上鎖時(shí),可以首先測試該鎖是否會被已存在的鎖阻止,接下來就使用F_SETFL給文件上鎖。在給文件上鎖時(shí),關(guān)鍵是給flock結(jié)構(gòu)體賦予相應(yīng)的變量,再將flock傳給fcntl即可。</p><p> 它是非常強(qiáng)大的文件鎖,可以實(shí)現(xiàn)對紀(jì)錄進(jìn)行加鎖,函數(shù)原
16、型如下:</p><p> int fcnt l ( int fd, int cmd, struct flock * lock) ;</p><p> 其中, 參數(shù)fd 表示文件描述符; 參數(shù)cmd 指定要進(jìn)行的鎖操作, 由于fcntl( )函數(shù)功能比較多, 這里先介紹與文件鎖相關(guān)的三個(gè)取值F_GETLK、F_SETLK以及F_SETLKW。這三個(gè)值均與flock 結(jié)構(gòu)有關(guān)。F_loc
17、k 結(jié)構(gòu)如下所示:</p><p> struct flock{</p><p> shortl_type ;</p><p> shortl_whence;</p><p> off_tl_start;</p><p> off_tl_len;</p><p> pid_tl_pi
18、d;</p><p><b> } ;</b></p><p> 在該結(jié)構(gòu)中, l type 用于指定鎖的類型, 它可以是F_RELCK、F_WRLCK、F_UNLCK ,分別是共享鎖(讀鎖) 、互斥鎖和解鎖操作。</p><p> l_whence 指定如何使用l_start 來設(shè)置鎖定的起始位置, 如果l_whence 取SEEK_S
19、ET , 表示從l_start 指定的位置作為鎖定的起始位置; 如果l_whence 取SEEK_CUR, 表示鎖定從當(dāng)前文件指針的位置加上l_start 開始; 如果l_whence 取SEEK_END, 表示鎖定從當(dāng)前文件的結(jié)束位置加上l_start開始。</p><p> 1_1en 表示鎖定區(qū)域的長度。</p><p> 1_pid 表示進(jìn)行鎖定的進(jìn)程的進(jìn)程號。</p&g
20、t;<p> 使用fcntl 進(jìn)行文件加鎖, 通常按照下面的步驟來進(jìn)行: 首先填充結(jié)構(gòu)中的參數(shù), 然后以匹配的方式打開文件, 最后調(diào)用fcntl 進(jìn)行文件加鎖。</p><p> 返回值成功則返回 0,若有錯誤則返回-1,錯誤原因存于errno 。</p><p> 四.程序流程圖
21、 </p><p> 圖 1.文件記錄鎖功能流程圖 圖 2. 文件寫入鎖/讀取鎖功能流程圖</p><p><b> 五.VI 簡介</b></p><p> vi 是 Linux/Unix 世界里極為普遍的可視化的
22、全屏幕文本編輯器(visual edit),幾乎可以說任何一臺 Linux/Unix 機(jī)器都會提供這個(gè)軟件. </p><p> vi 有三種狀態(tài),即編輯方式,插入方式和命令方式.在命令方式下,所有 命令都要以:開始,所鍵入的字符系統(tǒng)均作命令來處理,如:q 代表退出,:w 表 示存盤. 當(dāng)你進(jìn)入 vi 時(shí), 會首先進(jìn)入命令方式 (同時(shí)也是編輯方式) 按下 i 就 . 進(jìn)入插入方式,用戶輸入的可視字符都添加到文件
23、中,顯示在屏幕上.按下 ESC 就可以回到命令狀態(tài)(同時(shí)也是編輯方式). </p><p><b> 六.結(jié)果與調(diào)試</b></p><p><b> 終端1運(yùn)行結(jié)果:</b></p><p><b> 終端2運(yùn)行結(jié)果:</b></p><p><b> 七.
24、總結(jié)</b></p><p> 我認(rèn)為,在這學(xué)期的嵌入式課程設(shè)計(jì)中,在收獲知識的同時(shí),還收獲了閱歷,收獲了成熟,在此過程中,我通過查找大量資料,請教老師,以及不懈的努力,不僅培養(yǎng)了獨(dú)立思考的能力,在各種其它能力上也都有了提高。更重要的是,我學(xué)會了很多學(xué)習(xí)的方法。而這是日后最實(shí)用的,真的是受益匪淺。要面對社會的挑戰(zhàn),只有不斷的學(xué)習(xí)、實(shí)踐,再學(xué)習(xí)、再實(shí)踐。</p><p> 不
25、管怎樣,這些都是一種鍛煉,一種知識的積累,能力的提高。完全可以把這個(gè)當(dāng)作基礎(chǔ)東西,只有掌握了這些最基礎(chǔ)的,才可以更進(jìn)一步,取得更好的成績。很少有人會一步登天吧。永不言棄才是最重要的。</p><p> 而且,這對于我的將來也有很大的幫助。以后,不管有多苦,我想我們都能變苦為樂,找尋有趣的事情,發(fā)現(xiàn)其中珍貴的事情。就像中國提倡的艱苦奮斗一樣,我都可以在結(jié)束之后變的更加成熟,會面對需要面對的事情。</p>
26、;<p> 嵌入式課程設(shè)計(jì)雖然結(jié)束了,也留下了很多遺憾,因?yàn)橛捎跁r(shí)間的緊缺和許多課業(yè)的繁忙,并沒有做到最好,但是,最起碼我沒有放棄,它是我們的驕傲!相信以后我會以更加積極地態(tài)度對待我們的學(xué)習(xí)、對待我們的生活。我們的激情永遠(yuǎn)不會結(jié)束,相反,我們會更加努力,努力的去彌補(bǔ)自己的缺點(diǎn),發(fā)展自己的優(yōu)點(diǎn),去充實(shí)自己,只有在了解了自己的長短之后,我們會更加珍惜擁有的,更加努力的去完善它,增進(jìn)它。只有不斷的測試自己,挑戰(zhàn)自己,才能擁有更
27、多的成功和快樂!to us, happiness equals success! 快樂至上,享受過程,而不是結(jié)果!認(rèn)真對待每一個(gè)任務(wù),珍惜每一分一秒,學(xué)到最多的知識和方法,鍛煉自己的能力,這個(gè)是我設(shè)計(jì)過程中學(xué)到的最重要的東西,也是以后都將受益匪淺的! </p><p> 對本學(xué)期嵌入式課程設(shè)計(jì)的評價(jià)</p><p> 趣味性強(qiáng),不僅鍛煉能力,而且可以學(xué)到很多東西,在與老師和同學(xué)的交流過
28、程中,互動學(xué)習(xí),將知識融會貫通。</p><p><b> 八.參考文獻(xiàn):</b></p><p> 【1】《馬士兵Linux視頻教程》 </p><p> 【2】《鳥哥的Linux私房菜》</p><p> 【3】《嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程》</p><p> 【4】[美
29、] Dav id A Rusling 著. 朱 珂譯. Linux 編程白皮書[M ] . </p><p><b> 附錄:</b></p><p> #include<unistd.h></p><p> #include<sys/file.h></p><p> #include&l
30、t;sys/types.h></p><p> #include<sys/stat.h></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p> #include<string.h></p>&l
31、t;p> void lock_set(int fd,int type);</p><p> int lock_reg(int fd,int cmd,int type,off_t offset,int whence,off_t len);</p><p> int main(int argc,char *argv[])</p><p><b>
32、 {</b></p><p> int fd,nwrite,nread,len,c;</p><p> char reply;</p><p> char buff[100];</p><p> char buf_r[100];</p><p> fd=open("hello"
33、,O_RDWR|O_CREAT,0666);</p><p><b> if(fd<0){</b></p><p> perror("open");</p><p><b> exit(1);</b></p><p><b> }</b><
34、;/p><p> while((c=getopt(argc,argv,"w:r"))!=-1)</p><p><b> switch(c)</b></p><p><b> {</b></p><p><b> case 'w':</b>
35、;</p><p> lock_set(fd,F_WRLCK);</p><p> len=sizeof(buff);</p><p> if((nwrite=write(fd,buff,len))>0){</p><p> printf("write success\n");</p><
36、p><b> }</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> printf("want to unlock?(Y/N)\n");</p><p> scanf("
37、;%c",&reply);</p><p> if((reply=='Y')||(reply=='y'))</p><p><b> {</b></p><p> lock_set(fd,F_UNLCK);</p><p><b> break;<
38、/b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> sleep(2);</b></p><p><b>
39、 continue;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> case 'r':</b></p&
40、gt;<p> lock_set(fd,F_RDLCK);</p><p> lseek(fd,0,SEEK_SET);</p><p> if((nread=read(fd,buf_r,100))>0){</p><p> printf("read:%s\n",buf_r);</p><p>
41、<b> }</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> printf("want to unlock?(Y/N)\n");</p><p> scanf("%c&q
42、uot;,&reply);</p><p> if((reply=='Y')||(reply=='y'))</p><p><b> {</b></p><p> lock_set(fd,F_UNLCK);</p><p><b> break;</b>
43、;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> sleep(2);</b></p><p><b> cont
44、inue;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> default:</b></p><p>
45、 printf("prog[+w+content]]-r]\n");</p><p><b> break;</b></p><p><b> }</b></p><p> close(fd);</p><p><b> exit(0);</b>&
46、lt;/p><p><b> }</b></p><p> void lock_set(int fd,int type)</p><p><b> {</b></p><p> struct flock lock;</p><p> lock.l_whence=SEEK
47、_SET;</p><p> lock.l_start=0;</p><p> lock.l_len=0;</p><p><b> while(1)</b></p><p><b> {</b></p><p> lock.l_type=type;</p&g
48、t;<p> if((fcntl(fd,F_SETLK,&lock))==0)</p><p><b> {</b></p><p> if(lock.l_type==F_RDLCK)</p><p> printf("read lock set by %d\n",getpid());</
49、p><p> else if(lock.l_type==F_WRLCK)</p><p> printf("write lock set by %d\n",getpid());</p><p> else if(lock.l_type==F_UNLCK)</p><p> printf("release lo
50、ck set by %d\n",getpid());</p><p><b> return;</b></p><p><b> }</b></p><p> fcntl(fd,F_GETLK,&lock);</p><p> if(lock.l_type!=F_UNLCK
51、)</p><p><b> {</b></p><p> if(lock.l_type==F_RDLCK)</p><p> printf("read lock already set by %d\n",lock.l_pid);</p><p> else if(lock.l_type==F
52、_WRLCK)</p><p> printf("write lock already set by %d\n",lock.l_pid);</p><p> getchar();</p><p><b> }</b></p><p><b> }</b></p&g
53、t;<p><b> }</b></p><p> int lock_reg(int fd,int cmd,int type,off_t offset,int whence,off_t len)</p><p><b> {</b></p><p> struct flock lock;</p&
54、gt;<p> lock.l_type=type;</p><p> lock.l_whence=whence;</p><p> lock.l_start=offset;</p><p> lock.l_len=len;</p><p> return(fcntl(fd,cmd,&lock));</p&
55、gt;<p><b> }</b></p><p> lock_test(int fd,int type,off_t offset,int whence,off_t len)</p><p><b> {</b></p><p> struct flock lock;</p><p
56、> lock.l_type=type;</p><p> lock.l_whence=whence;</p><p> lock.l_start=offset;</p><p> lock.l_len=len;</p><p> if(fcntl(fd,F_GETLK,&lock)<0)</p>&
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)報(bào)告2
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)報(bào)告 (2)
- 嵌入式課程設(shè)計(jì)報(bào)告91452
- 嵌入式課程設(shè)計(jì)---嵌入式網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)
- 嵌入式觸摸屏課程設(shè)計(jì)---arm嵌入式系統(tǒng)
- 《嵌入式系統(tǒng)設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- 嵌入式課程設(shè)計(jì)報(bào)告--數(shù)字相框
- 嵌入式課程設(shè)計(jì)報(bào)告--qtopia移植
- 嵌入式課程設(shè)計(jì)--串口通信
- 嵌入式課程設(shè)計(jì)大作業(yè)
- 嵌入式系統(tǒng)綜述課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)報(bào)告畢業(yè)論文
- 嵌入式課程設(shè)計(jì)報(bào)告畢業(yè)論文
- 課程設(shè)計(jì)---嵌入式系統(tǒng)項(xiàng)目設(shè)計(jì)
評論
0/150
提交評論