




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(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í) 計(jì)科1105班 學(xué) 號(hào) 03041105 學(xué)生姓名 二一四年十二月請(qǐng)預(yù)覽后下載!請(qǐng)預(yù)覽后下載!目錄一、設(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é)果與分析11
2、五、設(shè)計(jì)體會(huì)14六、參考文獻(xiàn)14請(qǐng)預(yù)覽后下載!一、設(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ì)信息并存儲(chǔ)在stat結(jié)構(gòu)體中。 如果這個(gè)參數(shù)是一個(gè)文件名,我們輸出這個(gè)文件的大小和最后修改的時(shí)間,如果是一個(gè)目錄我們輸出這個(gè)目錄下所有文件的大小和修改時(shí)間。使用一個(gè)數(shù)組flags4來標(biāo)記輸入的命令是-l、-i、-t還是空(沒有輸入命令)。當(dāng)選擇-l功能時(shí),是以長列表方式顯示,即顯示詳
4、細(xì)信息;當(dāng)選擇-i功能時(shí),是顯示每一個(gè)文件在系統(tǒng)里的文件號(hào);當(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;請(qǐng)預(yù)覽后下載!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結(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)體 對(duì)于dirent結(jié)構(gòu)體,首先我們要弄清楚目錄文件(
6、directory file)的概念。這種文件包含了其他文件的名字以及指向與這些文件有關(guān)的信息的指針。從定義能夠看出,dirent不僅僅指向目錄,還指向目錄中的具體文件,readdir函數(shù)同樣也讀取目錄下的文件。以下為dirent結(jié)構(gòu)體的定義:struct direntlong d_ino; /*inode number 索引節(jié)點(diǎn)號(hào)*/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結(jié)構(gòu)體存儲(chǔ)的關(guān)于文件的信息很少,所以dirent同樣也是起著一個(gè)索引的作用。2.1.3 stat結(jié)構(gòu)體 如果想獲得類似ls -l那種效果的文件信息,必須要靠stat函數(shù)了。通過readdir函數(shù)讀取到的文件名存儲(chǔ)在結(jié)構(gòu)體dirent的d_name成員中,而函數(shù)int stat(const char *file_name, struct stat *buf);的作用就是獲取文件名為d_name的文件的詳細(xì)信
8、息,存儲(chǔ)在stat結(jié)構(gòu)體中。以下為stat結(jié)構(gòu)體的定義:請(qǐng)預(yù)覽后下載!structstat mode_t st_mode; /文件訪問權(quán)限ino_t st_ino; /索引節(jié)點(diǎn)號(hào)dev_t st_dev; /文件使用的設(shè)備號(hào)dev_t st_rdev; /設(shè)備文件的設(shè)備號(hào)nlink_t st_nlink; /文件的硬連接數(shù)uid_t st_uid; /所有者用戶識(shí)別號(hào)gid_t st_gid; /組識(shí)別號(hào)off_t st_size; /以字節(jié)為單位的文件容量time_t st_atime; /最后一次訪問該文件的時(shí)間time_t st_mtime; /最后一次修改該文件的時(shí)間time_t st
9、_ctime; /最后一次改變?cè)撐募顟B(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()類似,接下來對(duì)目錄的
10、讀取和搜索都要使用此返回值。返回值如果成功則返回dir* 型態(tài)的目錄流,如果打開失敗則返回null。2.2.2 readdir函數(shù) 該函數(shù)的功能是讀取目錄。相關(guān)函數(shù)open,opendir,closedir,rewinddir,seekdir,telldir,scandir表頭文件#include#include請(qǐng)預(yù)覽后下載!定義函數(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
11、 closedir函數(shù) 該函數(shù)的功能是關(guān)閉目錄。相關(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ì)信息并存儲(chǔ)輸出目錄下所有文件的大小和修改時(shí)間否請(qǐng)預(yù)覽后下載!是三、詳細(xì)設(shè)計(jì)(含源程序) 本實(shí)驗(yàn)是實(shí)現(xiàn)linux下的ls功能。首先設(shè)置標(biāo)志,
12、判斷輸入的命令。如果是普通文件,則遞歸輸出文件的相關(guān)信息,如文件的大小和最后修改時(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 my
13、ls(char *s, bool flag);void lprint(char* fname);/*main函數(shù)入口*/int main(int argc, char *argv)char c;int i;請(qǐng)預(yù)覽后下載!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) /命令行沒有輸入目
14、錄參數(shù),設(shè)定函數(shù)目錄參數(shù)為當(dāng)前目錄myls(., flags);elsefor (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 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存儲(chǔ)的文件信息進(jìn)行排序*/for (i = 0; i num - 1; i+)for (j
16、 = i + 1; j num; j+)if (sorti.st_mtime 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
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);請(qǐng)預(yù)覽后下載!switch (buf.st_mode & s_ifmt)/獲取并轉(zhuǎn)換后打印文件類型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-)/獲取并轉(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ù)
20、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é)果如下:請(qǐng)預(yù)覽后下載!3. -i命令運(yùn)行結(jié)果如下:4. -t命令運(yùn)行結(jié)果如下:5. -l -i組合命令運(yùn)行結(jié)果如下:請(qǐng)預(yù)覽后下載!6. -l -t組合命令運(yùn)行結(jié)果如下:7
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《盈利策略與財(cái)務(wù)抉擇》課件
- 麥委托加工協(xié)議
- 線下銷售工作簡歷模板
- 《先進(jìn)的CAE仿真技術(shù)》課件
- 高中生物競(jìng)賽課件 -組成細(xì)胞的分子基礎(chǔ)課時(shí)8
- 探索溫度變化對(duì)化學(xué)平衡的影響:課件展示
- 雙十二體育消費(fèi)洞察
- 《工程制圖標(biāo)準(zhǔn)》課件
- 《炭黑顏料的概述》課件
- 2025投資咨詢合同范本
- 偵探推理題(含答案)
- 熱塑性聚酯彈性體(TPEE)
- 畢業(yè)論文機(jī)電一體化發(fā)展歷程及其面臨的形勢(shì)和任務(wù)
- 家具廠首件檢驗(yàn)記錄表
- 《中小學(xué)綜合實(shí)踐活動(dòng)課程指導(dǎo)綱要》教育部2022版
- 太上碧落洞天慈航靈感度世寶懺
- 國家標(biāo)準(zhǔn)硬度轉(zhuǎn)換表參考模板
- 輪胎式裝載機(jī)檢測(cè)報(bào)告(共5頁)
- 彎矩二次分配法excel表-(1)
- 半導(dǎo)體分立器件制造公司績效制度范文
- 鐵板神數(shù)詳細(xì)取數(shù)法(共16頁)
評(píng)論
0/150
提交評(píng)論