嵌入式課程設(shè)計(jì)報(bào)告---嵌入式文件鎖應(yīng)用_第1頁
已閱讀1頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論