




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、文件系統(tǒng)ls實現與內核編碼一. 設計目的操作系統(tǒng)是控制和管理計算機硬件和軟件資源的虛擬機,其中的文件系統(tǒng)是對軟件和設備進行管理的系統(tǒng),文件系統(tǒng)是操作系統(tǒng)中非常重要的一個模塊,它的實現占用了操作系統(tǒng)源碼的最大編碼量,其好壞也直接影響著用戶對操作系統(tǒng)的感受程度。通過對操作系統(tǒng)課程設計的實踐,進一步加深對文件系統(tǒng)的認識和理解,并在此基礎上培養(yǎng)學生的工程應用能力。實驗分別從用戶態(tài)和內核態(tài)兩個層實踐文件系統(tǒng)的部分功能。二. 設計內容1.使用Linux編程實現用戶態(tài)下帶參數的ls命令功能ls命令支持以下功能:支持 -l 參數;輸出結果按字典排序;列出“.”文件,支持-a參數,在沒有-a時候不顯示隱藏文件;
2、顯示記錄總數;支持對給定的目錄進行操作,如 ls /tmp;正確顯示文件特殊屬性suid、sgid和sticky;支持-u參數,它會顯示出文件的最后訪問時間;當關掉一個文件的讀權限,就不能打開這個文件來讀。如果從一個終端登錄,打開一個文件,保持文件的打開狀態(tài),然后從另外的終端登錄,去掉文件的讀權限,看會出現什么情況。編寫一個程序,先用open()打開一個文件,用read()讀一些內容,調用sleep()等待20s以后,再讀一些內容,從另外的終端,再等待的20s內去掉文件的讀權限,這樣會有什么結果?2. 編寫內核模塊顯示目錄或文件的信息。調試Linux操作系統(tǒng)原理與應用第8章文件系統(tǒng)P215 的
3、例子給內核模塊傳入參數path,其中path為絕對路徑當path為目錄時,顯示目錄對應的dentrey結構中的相關信息(可打印的信息);當path為文件時,顯示文件對應的indoe結構中的相關信息(可打印的信息);當路徑錯誤時,有錯誤提示信息。三概要設計1功能模塊圖;實現ls命令功能 實現 ls運行命令修改文件權限chmod文件特殊權限eg:chmod7363 2.cls /指定目錄ls -uls -als -l ls文件名按字典排序 在一終端運行1.c ,讀出文件中的內容,在另一終端修改文件權限,再顯示結果,然后在修改文件權限,再顯示結果。 Ls -laLs -luLs -uaLs -lua
4、Ls 指定文件/指定目錄 -l Ls 指定文件/指定目錄 -uLs 指定文件/指定目錄 -aLs 指定文件/指定目錄 -laLs 指定文件/指定目錄 -luLs 指定文件/指定目錄 -uaLs 指定文件/指定目錄 -lua編寫內核模塊編寫內核模塊,打印super_block結構中一些域的值。(課本上的例子) 運行 加鎖遍歷系統(tǒng)中的 超級塊打印文件系統(tǒng)所在的主設備號和次設備號打印文件系統(tǒng)名遍歷打印每個超級塊中的所有索引節(jié)點號 解鎖索引節(jié)點數量給內核模塊傳入參數path,其中path為絕對路徑 運行 path=文件 錯誤路徑 path=目錄顯示錯誤信息顯示文件信息 顯示目錄信息2 各個模塊詳細的功
5、能描述。實現ls命令功能ls -l:每個文件單獨占一行,顯示文件的詳細屬性信息ls -a:顯示包括隱藏文件在內的所有文件ls -u:顯示出文件的最后訪問時間ls:顯示的文件名按字典順序排序ls /指定目錄:顯示當前目錄下的內容ls -lu:每個文件單獨占一行,顯示文件的詳細屬性信息,并且顯示出文件的最后訪問時間ls -la:顯示包括隱藏文件在內的所有文件的詳細屬性信息ls -lua:顯示包括隱藏文件在內的所有文件的詳細屬性信息,并且顯示出文件的最后訪問時間chmod 權限 文件名:修改文件的權限,并且顯示出此文件是否受suid,sgid和sticky的控制chmod 權限(3位) 在一終端運行
6、程序,讀取文件信息,在另一終端修改文件權限,看結果。編寫內核模塊編寫內核模塊,打印super_block結構中一些域的值。(課本上的例子)遍歷系統(tǒng)中的超級塊:list_head結構類型的字段名稱為s_list。list_entry宏通過指向list_head節(jié)點的地址來得到外部超級塊的首地址。獲取系統(tǒng)中個超級塊的地址,獲得某個子進程的地址,打印文件系統(tǒng)所在的主設備號和次設備號和文件系統(tǒng)名。遍歷打印每個超級塊中的所有索引節(jié)點號,打印索引結點。給內核模塊傳入參數path,其中path為絕對路徑path=路徑時,顯示如下信息:目錄項標志哈希表短目錄名目錄項長度目錄項名目錄項計數器的引用path=文件
7、時,顯示如下信息:文件索引節(jié)點的數量文件類型和權限用戶ID用戶組ID指定文件系統(tǒng)的讀寫訪問標志文件大小索引節(jié)點的狀態(tài)硬鏈接數引用記數文件的塊數版本號以位為單位的塊大小錯誤信息顯示:Open file failed四詳細設計1功能函數的調用關系圖ls命令錯誤處理函數,打印出錯誤所在行的行數和錯誤信息void my_error(const char *error_string, int line);獲取文件屬性void show_file_attribute(struct stat buf,char *file_name,int flag_u)輸出文件的文件名,若命令中沒有-l選項,則輸出文件時要
8、保證上下對齊void show_file_columns(char *file_name)根據命令行參數(存放在flag中)和完整路徑名(存放在pathname中)顯示目標文件void show_file(int flag,char *pathname)為顯示某個目錄下的文件做準備,path:要顯示的目錄void show_file_dir(int flag_param,char *path)main函數 show_fileshow_file_dir show_file_attribute show_file_columns my_error編寫內核模塊編寫內核模塊,打印super_block
9、結構中一些域的值。(課本上的例子) my_init module_init(my_init) my_exit module_exit(my_exit)給內核模塊傳入參數path,其中path為絕對路徑 module_init(param_init) param_init kernel_file_open(p_pchar) kernel_dir_info()kernel_file_info(); param_init module_exit(param_exit)2 各功能函數的數據流程圖ls命令獲取文件屬性void show_file_attribute(struct stat buf,cha
10、r *file_name,int flag_u) 獲取并打印文件類型) 獲取文件所有者的權限獲取文件所有者同組的用戶對該文件的操作權限獲取并打印其他用戶對文件的操作權限庫函數getpwuid訪問用戶信息getgrgid訪問組列表 獲取時間輸出文件的文件名,若命令中沒有-l選項,則輸出文件時要保證上下對齊void show_file_columns(char *file_name)本行不足以打印一個文件名則換行每兩個相鄰文件之間空2格根據命令行參數(存放在flag中)和完整路徑名(存放在pathname中)顯示目標文件void show_file(int flag,char *pathname)
11、從路徑中解析出文件名ls -ulals -ulls -uals -als -uls -l ls為顯示某個目錄下的文件做準備,path:要顯示的目錄void show_file_dir(int flag_param,char *path)獲取該目錄下文件總數和最長的文件名對整個目錄進行遍歷獲取該目錄下所有的文件名文件名按最后訪問時間進行排序文件名按字母順序存儲于filenames編寫內核模塊編寫內核模塊,打印super_block結構中一些域的值。(課本上的例子)打印super_blocks域 加鎖遍歷系統(tǒng)中的超級塊獲取系統(tǒng)中個超級塊的地址打印文件系統(tǒng)所在的主設備號和次設備號和文件系統(tǒng)名遍歷打印
12、每個超級塊中的所有索引節(jié)點號打印索引結點 解鎖 索引節(jié)點數量給內核模塊傳入參數path,其中path為絕對路徑文件信息通過file獲取dentry再獲取inode的相關信息輸出文件索引節(jié)點的信息文件索引節(jié)點的數量文件類型和權限用戶ID用戶組ID指定文件系統(tǒng)的讀寫訪問標志文件大小索引節(jié)點的狀態(tài)硬鏈接數引用記數文件的塊數版本號以位為單位的塊大小目錄信息通過file獲取dentry相關信息輸出目錄項信息目錄項標志哈希表短目錄名目錄項長度目錄項名目錄項計數器的引用3 重點設計及編碼ls命令重點設計:為顯示某個目錄下的文件做準備,path:要顯示的目錄編碼:void show_file_dir(int
13、flag_param,char *path)DIR *dir;/ 對目錄進行操作struct dirent *ptr;/對目錄的數據項進行操作int count=0;char filenames256PATH_MAX+1,tempPATH_MAX+1;char tempfilePATH_MAX+1;struct stat buf;int atimePATH_MAX+1,temp1;/獲取該目錄下文件總數和最長的文件名dir=opendir(path);if(dir=NULL)my_error(opendir,_LINE_);while(ptr=readdir(dir)!=NULL)/對整個目錄
14、進行遍歷if(filename_maxlend_name)filename_maxlen=strlen(ptr-d_name);count+;closedir(dir);if(count256)my_error(這個目錄下的文件太多了,_LINE_);int i,j,length=strlen(path);/獲取該目錄下所有的文件名dir=opendir(path);for(i=0;id_name);if(lstat(tempfile,&buf) = -1)my_error(lstat, _LINE_);atimei = buf.st_atime;strncpy(filenamesi,path
15、,length);/保存文件路徑filenamesilength=0;strcat(filenamesi,ptr-d_name);/d_name:當前目錄下所有文件/子目錄filenamesilength+strlen(ptr-d_name)=0;/文件名按最后訪問時間進行排序if(flag_param = PARAM_U|(flag_param = PARAM_U+PARAM_A)for(i = 0;i count-1;i+)for(j = i+1;j count;j+)if(atimei atimej)temp1 = atimei;atimei = atimej;atimej = temp
16、1;strcpy(tempfile,filenamesi);strcpy(filenamesi,filenamesj);strcpy(filenamesj,tempfile);else/文件名按字母順序存儲于filenames for(i = 0; i count-1; i+) for(j = 0; j 0 ) strcpy(temp,filenamesj+1); tempstrlen(filenamesj+1) = 0; strcpy(filenamesj+1,filenamesj); filenamesj+1strlen(filenamesj) = 0; strcpy(filenamesj
17、, temp); filenamesjstrlen(temp) = 0; for(i = 0; i s_dev),MINOR(sb-s_dev);/打印文件系統(tǒng)名printk(file_type name:%s,sb-s_type-name);/遍歷打印每個超級塊中的所有索引節(jié)點號list_for_each(linode,&sb-s_inodes)pinode=list_entry(linode,struct inode,i_sb_list);count+;printk(%lut,pinode-i_ino);/打印索引結點給內核模塊傳入參數path,其中path為絕對路徑重點設計:打開文件編碼
18、:static int kernel_file_open(char *path)/O_DIRECTORY 如果參數所指的文件并非為一目錄,則打開文件失敗/ 以目錄的形式打開file=filp_open(path,O_DIRECTORY,0);if(IS_ERR(file)file=filp_open(path,O_RDWR|O_CREAT,0777);if(IS_ERR(file)printk(Open file %s failed.n,path);/ 路徑錯誤return 0;/文件printk(open file success!n);printk(Path of file: %s,pat
19、h);kernel_file_info();printk(ending!n);filp_close(file,NULL);return 1;else/目錄printk(nThis is a diretory!n);printk(Path of directory: %s,path);kernel_dir_info();printk(ending!n);filp_close(file,NULL);return 0;5 測試數據及運行結果1正常測試數據和運行結果ls命令lsls -l 并顯示總記錄數ls -als -uls -ulls -uals -lals -lauls /tmpls -l 文件
20、名.c 修改文件的屬性并看suid,sgid,sticky是否起作用了。修改文件權限讀取3.txt中的內容修改3.txt的權限再讀取3.txt修改3.txt權限再讀取3.txt編寫內核模塊編寫內核模塊,打印super_block結構中一些域的值。(課本上的例子)插入:insmod卸載:rmmod顯示:dmesg運行結果:顯示主設備號,次設備號,文件類型名和索引節(jié)點數量。給內核模塊傳入參數path,其中path為絕對路徑調試path=文件path=目錄當目錄中沒有文件時,會自動創(chuàng)建指定文件路徑錯誤時,報錯2 異常測試數據及運行結果ls命令編寫內核模塊編寫內核模塊,打印super_block結構中一些域的值。(課本上的例子)給內核模塊傳入參數path,其中path為絕對路徑六調試情況,設計技巧及體會1 改進方案在使用Linux編程實現用戶態(tài)下帶參數的ls命令功能的過程中,我實現了基本要求和部分高級要求,使得ls的部分命令可以實現,但是我的代碼沒有實現ls -R遞歸地列出目錄中所有的文件包含子目錄中的文件和輸出結果分欄排序,每欄的寬度由這一欄最長的文件名決定,顯示的欄數還受終端顯示器的的寬度影響,每一列盡可能的等寬。這樣讓顯示結果看上去不是那么的整齊。為了使顯示結果看起來整齊并且代碼功能強大,在代碼中添加遞歸,遍歷等和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水博園研學活動方案
- 棋藝比賽活動方案
- 桓臺部門團建活動方案
- 橫溪街道宣講活動方案
- 法宣傳活動方案
- 桂林沙發(fā)活動策劃方案
- 水果拼盤新年活動方案
- 漢服設計課間活動方案
- 民生實事大比拼活動方案
- 植樹節(jié)民警活動方案
- 對公客戶經理培訓課件
- 社會文物鑒定質檢服務機構執(zhí)業(yè)能力認可管理體系(公開征求意見稿)
- 高標準農田建設監(jiān)理規(guī)范與實施策略
- 鋼絲繩編接作業(yè)知識培訓
- 人教版八年級道德與法治下冊教學設計:4.1公民基本義務
- 接觸網電連接壓接工藝及壓接質量檢查課件
- 2025北京朝陽六年級(上)期末數學試卷(含答案)
- 肝硬化門靜脈高壓癥食管、胃底靜脈曲張破裂出血診治專家共識(2025版)解讀
- 青少年心理健康發(fā)展調研報告
- 交警交通安全培訓
- 現場管理四大指標:安全、品質、成本、交期
評論
0/150
提交評論