![Linux下ls命令的實現(xiàn)_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/25/21026ff0-6d58-43d6-8551-5692d808bf39/21026ff0-6d58-43d6-8551-5692d808bf391.gif)
![Linux下ls命令的實現(xiàn)_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/25/21026ff0-6d58-43d6-8551-5692d808bf39/21026ff0-6d58-43d6-8551-5692d808bf392.gif)
![Linux下ls命令的實現(xiàn)_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/25/21026ff0-6d58-43d6-8551-5692d808bf39/21026ff0-6d58-43d6-8551-5692d808bf393.gif)
![Linux下ls命令的實現(xiàn)_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/25/21026ff0-6d58-43d6-8551-5692d808bf39/21026ff0-6d58-43d6-8551-5692d808bf394.gif)
![Linux下ls命令的實現(xiàn)_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/25/21026ff0-6d58-43d6-8551-5692d808bf39/21026ff0-6d58-43d6-8551-5692d808bf395.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、linux環(huán)境程序設計大作業(yè)報告題目: linux下ls命令的實現(xiàn) 學 院 物聯(lián)網(wǎng)工程學院 專 業(yè)計算機科學與技術 班 級 計科1105班 學 號 03041105 學生姓名 二一四年十二月請預覽后下載!請預覽后下載!目錄一、設計思想21.1 實驗要求21.2 設計思路2二、數(shù)據(jù)定義、系統(tǒng)(函數(shù))調(diào)用、處理流程22.1 數(shù)據(jù)定義22.1.1 dir結構體22.1.2 dirent結構體32.1.3 stat結構體32.2 系統(tǒng)調(diào)用42.2.1 opendir函數(shù)42.2.2 readdir函數(shù)42.2.3 closedir函數(shù)52.3 處理流程5三、詳細設計(含源程序)6四、運行結果與分析11
2、五、設計體會14六、參考文獻14請預覽后下載!一、設計思想1.1 實驗要求 使用opendir、readdir、closedir等函數(shù)來操作目錄,利用stat函數(shù)來獲取文件信息。編寫一個功能完整的實現(xiàn)linux下ls命令的程序,該程序?qū)崿F(xiàn)了-l、-i、-t這幾個選項的功能。其中,-l、-i、-t選項說明: -l:use a long listing format.-i:print the index number of each file. -t:sort by modification time, newest first.1.2 設計思路 本實驗是實現(xiàn)linux下的ls功能。其設計思路如下
3、:目的是獲取某目錄下文件的詳細信息。(1) 首先使用opendir()函數(shù)打開目錄,返回指向該目錄的dir結構體。(2) 接著,調(diào)用readdir()函數(shù)讀取這個目錄下所有文件,其中應該包括目錄本身,返回指向該目錄下所有文件的dirent結構體。(3) 最后,遍歷dirent結構體,調(diào)用stat來獲取每個文件的詳細信息并存儲在stat結構體中。 如果這個參數(shù)是一個文件名,我們輸出這個文件的大小和最后修改的時間,如果是一個目錄我們輸出這個目錄下所有文件的大小和修改時間。使用一個數(shù)組flags4來標記輸入的命令是-l、-i、-t還是空(沒有輸入命令)。當選擇-l功能時,是以長列表方式顯示,即顯示詳
4、細信息;當選擇-i功能時,是顯示每一個文件在系統(tǒng)里的文件號;當選擇-t功能時,是按修改時間來排序,以最新的修改時間來輸出。二、數(shù)據(jù)定義、系統(tǒng)(函數(shù))調(diào)用、處理流程2.1 數(shù)據(jù)定義2.1.1 dir結構體 該結構體包含在頭文件#include 中,其定義如下:struct _dirstream void*_fd; char*_data;請預覽后下載!int _entry_data; char*_ptr;int _entry_ptr; size_t _allocation; size_t _size; _libc_lock_define(,_lock);typedef struct _dirstr
5、eam dir; dir結構體類似于file,是一個內(nèi)部結構,以下幾個函數(shù)用這個內(nèi)部結構保存當前正在被讀取的目錄的有關信息。函數(shù) dir *opendir(const char *pathname),即打開文件目錄,返回的就是指向dir結構體的指針,而該指針由以下幾個函數(shù)使用:structdirent*readdir(dir*dp);voidrewinddir(dir*dp);intclosedir(dir*dp);longtelldir(dir*dp);voidseekdir(dir*dp,long loc);2.1.2 dirent結構體 對于dirent結構體,首先我們要弄清楚目錄文件(
6、directory file)的概念。這種文件包含了其他文件的名字以及指向與這些文件有關的信息的指針。從定義能夠看出,dirent不僅僅指向目錄,還指向目錄中的具體文件,readdir函數(shù)同樣也讀取目錄下的文件。以下為dirent結構體的定義:struct direntlong d_ino; /*inode number 索引節(jié)點號*/off_td_off; /*offsettothis dirent 在目錄文件中的偏移*/unsigned shortd_reclen;/*length of this d_name文件名長*/unsigned char d_type; /*the type o
7、f d_name文件類型*/char d_namename_max+1;/*file name(null-terminated)文件名,最長255字符*/ 從上述定義也能夠看出來,dirent結構體存儲的關于文件的信息很少,所以dirent同樣也是起著一個索引的作用。2.1.3 stat結構體 如果想獲得類似ls -l那種效果的文件信息,必須要靠stat函數(shù)了。通過readdir函數(shù)讀取到的文件名存儲在結構體dirent的d_name成員中,而函數(shù)int stat(const char *file_name, struct stat *buf);的作用就是獲取文件名為d_name的文件的詳細信
8、息,存儲在stat結構體中。以下為stat結構體的定義:請預覽后下載!structstat mode_t st_mode; /文件訪問權限ino_t st_ino; /索引節(jié)點號dev_t st_dev; /文件使用的設備號dev_t st_rdev; /設備文件的設備號nlink_t st_nlink; /文件的硬連接數(shù)uid_t st_uid; /所有者用戶識別號gid_t st_gid; /組識別號off_t st_size; /以字節(jié)為單位的文件容量time_t st_atime; /最后一次訪問該文件的時間time_t st_mtime; /最后一次修改該文件的時間time_t st
9、_ctime; /最后一次改變該文件狀態(tài)的時間blksize_t st_blksize;/包含該文件的磁盤塊的大小blkcnt_t st_blocks; /該文件所占的磁盤塊;2.2 系統(tǒng)調(diào)用2.2.1 opendir函數(shù) 該函數(shù)的功能是打開目錄。相關函數(shù)open,readdir,closedir,rewinddir,seekdir,telldir,scandir表頭文件#include#include定義函數(shù)dir * opendir(const char * name);函數(shù)說明opendir()用來打開參數(shù)name指定的目錄,并返回dir*形態(tài)的目錄流,和open()類似,接下來對目錄的
10、讀取和搜索都要使用此返回值。返回值如果成功則返回dir* 型態(tài)的目錄流,如果打開失敗則返回null。2.2.2 readdir函數(shù) 該函數(shù)的功能是讀取目錄。相關函數(shù)open,opendir,closedir,rewinddir,seekdir,telldir,scandir表頭文件#include#include請預覽后下載!定義函數(shù)struct dirent * readdir(dir * dir);函數(shù)說明readdir()返回參數(shù)dir目錄流的下個目錄進入點。返回值成功則返回下個目錄進入點。有錯誤發(fā)生或讀取到目錄文件尾則返回null。附加說明ebadf參數(shù)dir為無效的目錄流。2.2.3
11、 closedir函數(shù) 該函數(shù)的功能是關閉目錄。相關函數(shù)opendir表頭文件#include#include定義函數(shù)int closedir(dir *dir);函數(shù)說明closedir()關閉參數(shù)dir所指的目錄流。返回值如果關閉成功則返回0,如果失敗返回-1,錯誤原因存于errno 中。開始2.3 處理流程dir結構體opendir()打開目錄readdir()讀取目錄下文件dirent結構體結束輸出大小和最后修改時間是否為文件stat獲取每個文件詳細信息并存儲輸出目錄下所有文件的大小和修改時間否請預覽后下載!是三、詳細設計(含源程序) 本實驗是實現(xiàn)linux下的ls功能。首先設置標志,
12、判斷輸入的命令。如果是普通文件,則遞歸輸出文件的相關信息,如文件的大小和最后修改時間。如果是目錄,則輸出該目錄下的所有文件和非正常文件的大小以及修改時間。普通文件使用s_isreg()函數(shù),而目錄文件使用s_isdir()函數(shù)。源代碼如下:/*linux下的ls功能實現(xiàn)計科1105班 顏瀟雨*/#include #include #include #include #include #include #include #include #include #include #include static bool flags4; /標志,選項設定全局變量,用來確定是-l,-t還是-iint my
13、ls(char *s, bool flag);void lprint(char* fname);/*main函數(shù)入口*/int main(int argc, char *argv)char c;int i;請預覽后下載!while (c = getopt(argc, argv, alidtfr) != -1) /獲取命令行輸入的選項參數(shù)switch (c)case l:flags0 = 1; break;case i:flags1 = 1; break;case t:flags2 = 1; break;default:return -1;if (argc = optind) /命令行沒有輸入目
14、錄參數(shù),設定函數(shù)目錄參數(shù)為當前目錄myls(., flags);elsefor (i = optind; i argc; i+) /依序?qū)斎氲乃心夸泤?shù)進行myls函數(shù)操作myls(argvi, flags);return 0;/*myls函數(shù),調(diào)用lprint函數(shù)進行-l格式輸出*/int myls(char *s, bool flag)struct stat buf, statbuf, tmps;struct stat sort256;char *t;char fname256, tmpn256, sfname256;char sname256256;dir *dir;struct d
15、irent *pd;int num, i, j;if (lstat(s, &buf) d_name0 = .) | (pd-d_name0 != .)memset(fname, 0, 256);strcpy(fname, s);strcat(fname, /);strcat(fname, pd-d_name);lstat(fname, &sortnum); /讀取文件信息到緩存數(shù)組sort中strcpy(snamenum, pd-d_name); /保存文件名到緩存數(shù)組sname中num+;/*將sort存儲的文件信息進行排序*/for (i = 0; i num - 1; i+)for (j
16、 = i + 1; j num; j+)if (sorti.st_mtime sortj.st_mtime) /按最后修改時間進行排序tmps = sorti; sorti = sortj; sortj = tmps; /交換sorti與sortj/*交換snamei與snamej*/strcpy(tmpn, snamei);strcpy(snamei, snamej);strcpy(snamej, tmpn);/*將排序后的文件信息輸出*/for (i = 0; i d_name0 = .) | (pd-d_name0 != .)/-amemset(fname, 0, 256);strcpy
17、(fname, s);strcat(fname, /);strcat(fname, pd-d_name);lstat(fname, &statbuf);if (flag1) printf(%ldt, statbuf.st_ino);/-iif (flag0) lprint(fname);/-lprintf(%s, pd-d_name);if (flag0) printf(n);else printf(t);printf(n);return 0;elseif (flag1)printf(%ldt, buf.st_ino);/-iif (flag0) lprint(s);/-lprintf(%s,
18、 s);if (flag0) printf(n);else printf(t);printf(n);/*lprint函數(shù)處理-l格式輸出*/void lprint(char* fname)struct stat buf;int n;char link256;struct passwd *pw;struct group *gr;struct tm *t;lstat(fname, &buf);請預覽后下載!switch (buf.st_mode & s_ifmt)/獲取并轉換后打印文件類型case s_ifreg:printf(-);break;case s_ifdir:printf(d);bre
19、ak;case s_ifchr:printf(c);break;case s_ifblk:printf(b);break;case s_ififo:printf(p);break;case s_iflnk:printf(l);break;case s_ifsock:printf(s);break;for (n = 8; n = 0; n-)/獲取并轉換后打印文件的讀寫屬性if (buf.st_mode&(1 pw_name);gr = getgrgid(buf.st_gid);/所屬組名printf( %s, gr-gr_name);printf( %ld, buf.st_size);/字節(jié)數(shù)
20、t = localtime(&buf.st_mtime);/最后修改時間printf( %d-%d-%d %d:%d, t-tm_year + 1900, t-tm_mon + 1, t-tm_mday, t-tm_hour, t-tm_min);if (s_islnk(buf.st_mode)/判斷是否為鏈接printf( - );readlink(fname, link, 100);printf(%s, link);printf(t);4、 運行結果與分析1. 當不輸入命令時,即為空命令。運行結果如下:2. -l命令運行結果如下:請預覽后下載!3. -i命令運行結果如下:4. -t命令運行結果如下:5. -l -i組合命令運行結果如下:請預覽后下載!6. -l -t組合命令運行結果如下:7
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司餐廳裝修合同范本
- 副總勞務合同范本
- 產(chǎn)品轉讓合同范本
- 商業(yè)使用門面房出租合同范本
- 修腳店入股合同范例
- 二手升降機銷售合同范例
- 工程服務類合同范本
- 教學儀器購銷合同范本
- 出境社旅游合同范本
- 農(nóng)業(yè)種植項目合同范例
- 最高法院示范文本發(fā)布版3.4民事起訴狀答辯狀示范文本
- 2023-2024學年度上期七年級英語期末試題
- 2024年燃氣輪機值班員技能鑒定理論知識考試題庫-下(多選、判斷題)
- 交通法規(guī)課件
- (優(yōu)化版)高中地理新課程標準【2024年修訂版】
- 《Python程序設計》課件-1:Python簡介與應用領域
- 各類心理量表大全
- DB12T990-2020建筑類建設工程規(guī)劃許可證設計方案規(guī)范
- DB11T 1481-2024生產(chǎn)經(jīng)營單位生產(chǎn)安全事故應急預案評審規(guī)范
- 《氓》教學設計 2023-2024學年統(tǒng)編版高中語文選擇性必修下冊
- 《網(wǎng)店運營與管理》第3版 課件全套 白東蕊 第1-11章 網(wǎng)上開店概述- 移動網(wǎng)店運營
評論
0/150
提交評論