Linux下ls命令的實(shí)現(xiàn)_第1頁
Linux下ls命令的實(shí)現(xiàn)_第2頁
Linux下ls命令的實(shí)現(xiàn)_第3頁
Linux下ls命令的實(shí)現(xiàn)_第4頁
Linux下ls命令的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Linux環(huán)境程序設(shè)計(jì)大作業(yè)報(bào)告題目: Linux下ls命令的實(shí)現(xiàn) 學(xué) 院 物聯(lián)網(wǎng)工程學(xué)院 專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù) 班 級 計(jì)科1105班 學(xué) 號 03041105 學(xué)生姓名 二一四年十二月0Linux環(huán)境程序設(shè)計(jì)大作業(yè)報(bào)告目錄一、設(shè)計(jì)思想21.1 實(shí)驗(yàn)要求21.2 設(shè)計(jì)思路2二、數(shù)據(jù)定義、系統(tǒng)(函數(shù))調(diào)用、處理流程22.1 數(shù)據(jù)定義22.1.1 DIR結(jié)構(gòu)體22.1.2 dirent結(jié)構(gòu)體32.1.3 stat結(jié)構(gòu)體32.2 系統(tǒng)調(diào)用42.2.1 opendir函數(shù)42.2.2 readdir函數(shù)42.2.3 closedir函數(shù)52.3 處理流程5三、詳細(xì)設(shè)計(jì)(含源程序)6四、運(yùn)行結(jié)果與分

2、析11五、設(shè)計(jì)體會14六、參考文獻(xiàn)14一、設(shè)計(jì)思想1.1 實(shí)驗(yàn)要求 使用opendir、readdir、closedir等函數(shù)來操作目錄,利用stat函數(shù)來獲取文件信息。編寫一個(gè)功能完整的實(shí)現(xiàn)Linux下ls命令的程序,該程序?qū)崿F(xiàn)了-l、-i、-t這幾個(gè)選項(xiàng)的功能。其中,-l、-i、-t選項(xiàng)說明: -l:use a long listing format.-i:print the index number of each file. -t:sort by modification time, newest first.1.2 設(shè)計(jì)思路 本實(shí)驗(yàn)是實(shí)現(xiàn)Linux下的ls功能。其設(shè)計(jì)思路如下:目的是

3、獲取某目錄下文件的詳細(xì)信息。(1) 首先使用opendir()函數(shù)打開目錄,返回指向該目錄的DIR結(jié)構(gòu)體。(2) 接著,調(diào)用readdir()函數(shù)讀取這個(gè)目錄下所有文件,其中應(yīng)該包括目錄本身,返回指向該目錄下所有文件的dirent結(jié)構(gòu)體。(3) 最后,遍歷dirent結(jié)構(gòu)體,調(diào)用stat來獲取每個(gè)文件的詳細(xì)信息并存儲在stat結(jié)構(gòu)體中。 如果這個(gè)參數(shù)是一個(gè)文件名,我們輸出這個(gè)文件的大小和最后修改的時(shí)間,如果是一個(gè)目錄我們輸出這個(gè)目錄下所有文件的大小和修改時(shí)間。使用一個(gè)數(shù)組flags4來標(biāo)記輸入的命令是-l、-i、-t還是空(沒有輸入命令)。當(dāng)選擇-l功能時(shí),是以長列表方式顯示,即顯示詳細(xì)信息;

4、當(dāng)選擇-i功能時(shí),是顯示每一個(gè)文件在系統(tǒng)里的文件號;當(dāng)選擇-t功能時(shí),是按修改時(shí)間來排序,以最新的修改時(shí)間來輸出。二、數(shù)據(jù)定義、系統(tǒng)(函數(shù))調(diào)用、處理流程2.1 數(shù)據(jù)定義2.1.1 DIR結(jié)構(gòu)體 該結(jié)構(gòu)體包含在頭文件#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 _dirstream DIR; DI

5、R結(jié)構(gòu)體類似于FILE,是一個(gè)內(nèi)部結(jié)構(gòu),以下幾個(gè)函數(shù)用這個(gè)內(nèi)部結(jié)構(gòu)保存當(dāng)前正在被讀取的目錄的有關(guān)信息。函數(shù) DIR *opendir(const char *pathname),即打開文件目錄,返回的就是指向DIR結(jié)構(gòu)體的指針,而該指針由以下幾個(gè)函數(shù)使用:structdirent*readdir(DIR*dp);voidrewinddir(DIR*dp);intclosedir(DIR*dp);longtelldir(DIR*dp);voidseekdir(DIR*dp,long loc);2.1.2 dirent結(jié)構(gòu)體 對于dirent結(jié)構(gòu)體,首先我們要弄清楚目錄文件(directory f

6、ile)的概念。這種文件包含了其他文件的名字以及指向與這些文件有關(guān)的信息的指針。從定義能夠看出,dirent不僅僅指向目錄,還指向目錄中的具體文件,readdir函數(shù)同樣也讀取目錄下的文件。以下為dirent結(jié)構(gòu)體的定義:struct direntlong d_ino; /*inode number 索引節(jié)點(diǎn)號*/off_td_off; /*offsettothis dirent 在目錄文件中的偏移*/unsigned shortd_reclen;/*length of this d_name文件名長*/unsigned char d_type; /*the type of d_name文件類

7、型*/char d_nameNAME_MAX+1;/*file name(null-terminated)文件名,最長255字符*/ 從上述定義也能夠看出來,dirent結(jié)構(gòu)體存儲的關(guān)于文件的信息很少,所以dirent同樣也是起著一個(gè)索引的作用。2.1.3 stat結(jié)構(gòu)體 如果想獲得類似ls -l那種效果的文件信息,必須要靠stat函數(shù)了。通過readdir函數(shù)讀取到的文件名存儲在結(jié)構(gòu)體dirent的d_name成員中,而函數(shù)int stat(const char *file_name, struct stat *buf);的作用就是獲取文件名為d_name的文件的詳細(xì)信息,存儲在stat結(jié)構(gòu)

8、體中。以下為stat結(jié)構(gòu)體的定義:structstat mode_t st_mode; /文件訪問權(quán)限ino_t st_ino; /索引節(jié)點(diǎn)號dev_t st_dev; /文件使用的設(shè)備號dev_t st_rdev; /設(shè)備文件的設(shè)備號nlink_t st_nlink; /文件的硬連接數(shù)uid_t st_uid; /所有者用戶識別號gid_t st_gid; /組識別號off_t st_size; /以字節(jié)為單位的文件容量time_t st_atime; /最后一次訪問該文件的時(shí)間time_t st_mtime; /最后一次修改該文件的時(shí)間time_t st_ctime; /最后一次改變該文件

9、狀態(tài)的時(shí)間blksize_t st_blksize;/包含該文件的磁盤塊的大小blkcnt_t st_blocks; /該文件所占的磁盤塊;2.2 系統(tǒng)調(diào)用2.2.1 opendir函數(shù) 該函數(shù)的功能是打開目錄。相關(guān)函數(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ù)的功能是讀取目錄。相關(guān)函數(shù)open,opendir,closedir,rewinddir,seekdir,telldir,scandir表頭文件#include#include定義函數(shù)struct dirent * readdir(DIR * dir);函數(shù)說明readdir()返回參數(shù)dir目錄流的下個(gè)目錄進(jìn)入點(diǎn)。返回值成功則返回下個(gè)目錄進(jìn)入點(diǎn)。有錯(cuò)誤發(fā)生或讀取到目錄文件尾則返回NULL。附加說明EBADF參數(shù)dir為無效的目錄流。2.2.3 closedir函數(shù) 該函數(shù)的功能是關(guān)閉目錄。相

11、關(guān)函數(shù)opendir表頭文件#include#include定義函數(shù)int closedir(DIR *dir);函數(shù)說明closedir()關(guān)閉參數(shù)dir所指的目錄流。返回值如果關(guān)閉成功則返回0,如果失敗返回-1,錯(cuò)誤原因存于errno 中。開始2.3 處理流程DIR結(jié)構(gòu)體opendir()打開目錄readdir()讀取目錄下文件dirent結(jié)構(gòu)體結(jié)束輸出大小和最后修改時(shí)間是否為文件stat獲取每個(gè)文件詳細(xì)信息并存儲輸出目錄下所有文件的大小和修改時(shí)間否是三、詳細(xì)設(shè)計(jì)(含源程序) 本實(shí)驗(yàn)是實(shí)現(xiàn)Linux下的ls功能。首先設(shè)置標(biāo)志,判斷輸入的命令。如果是普通文件,則遞歸輸出文件的相關(guān)信息,如文件

12、的大小和最后修改時(shí)間。如果是目錄,則輸出該目錄下的所有文件和非正常文件的大小以及修改時(shí)間。普通文件使用S_ISREG()函數(shù),而目錄文件使用S_ISDIR()函數(shù)。源代碼如下:/*Linux下的ls功能實(shí)現(xiàn)計(jì)科1105班 顏瀟雨*/#include #include #include #include #include #include #include #include #include #include #include static bool flags4; /標(biāo)志,選項(xiàng)設(shè)定全局變量,用來確定是-l,-t還是-iint myls(char *s, bool flag);void lpri

13、nt(char* fname);/*main函數(shù)入口*/int main(int argc, char *argv)char c;int i;while (c = getopt(argc, argv, alidtFR) != -1) /獲取命令行輸入的選項(xiàng)參數(shù)switch (c)case l:flags0 = 1; break;case i:flags1 = 1; break;case t:flags2 = 1; break;default:return -1;if (argc = optind) /命令行沒有輸入目錄參數(shù),設(shè)定函數(shù)目錄參數(shù)為當(dāng)前目錄myls(., flags);elsefor

14、 (i = optind; i argc; i+) /依序?qū)斎氲乃心夸泤?shù)進(jìn)行myls函數(shù)操作myls(argvi, flags);return 0;/*myls函數(shù),調(diào)用lprint函數(shù)進(jìn)行-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 dirent *pd;int num, i, j;if (lstat(s, &b

15、uf) 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存儲的文件信息進(jìn)行排序*/for (i = 0; i num - 1; i+)for (j = i + 1; j num; j+)if (sorti.st_mtime

16、sortj.st_mtime) /按最后修改時(shí)間進(jìn)行排序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(fname, s);strcat(fname, /);strcat(fnam

17、e, 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, s);if (flag0) printf(n);else printf(t)

18、;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)/獲取并轉(zhuǎn)換后打印文件類型case S_IFREG:printf(-);break;case S_IFDIR:printf(d);break;case S_IFCHR:printf(c);break;case S_IFBLK:p

19、rintf(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-)/獲取并轉(zhuǎ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ù)t = localtime(&buf.st_mtime);/最后修改時(shí)間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、 運(yùn)行結(jié)果與分析1. 當(dāng)不輸入命令時(shí),即為空命令。運(yùn)行結(jié)果如下:2. -l命令運(yùn)行結(jié)果如下:3. -i命令運(yùn)行結(jié)果如下:4. -t命令運(yùn)行結(jié)果如下:5. -l -i組合命

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論