版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 西 安 郵 電 大 學(xué) (計(jì)算機(jī)學(xué)院)操作系統(tǒng)課程設(shè)計(jì)報(bào)告題 目:文件系統(tǒng)ls實(shí)現(xiàn)與內(nèi)核編碼 專業(yè)名稱: 班 級(jí): 學(xué)生姓名: 學(xué)號(hào)(8位): 指導(dǎo)教師: 設(shè)計(jì)起止時(shí)間: 2014年5月19日2014年5月30日一. 設(shè)計(jì)目的操作系統(tǒng)是控制和管理計(jì)算機(jī)硬件和軟件資源的虛擬機(jī),其中的文件系統(tǒng)是對(duì)軟件和設(shè)備進(jìn)行管理的系統(tǒng),文件系統(tǒng)是操作系統(tǒng)中非常重要的一個(gè)模塊,它的實(shí)現(xiàn)占用了操作系統(tǒng)源碼的最大編碼量,其好壞也直接影響著用戶對(duì)操作系統(tǒng)的感受程度。通過對(duì)操作系統(tǒng)課程設(shè)計(jì)的實(shí)踐,進(jìn)一步加深對(duì)文件系統(tǒng)的認(rèn)識(shí)和理解,并在此基礎(chǔ)上培養(yǎng)學(xué)生的工程應(yīng)用能力。實(shí)驗(yàn)分別從用戶態(tài)和內(nèi)核態(tài)兩個(gè)層實(shí)踐文件系統(tǒng)的部分功能。
2、二. 設(shè)計(jì)內(nèi)容1. 在linux下編程實(shí)現(xiàn)帶參數(shù)的shell命令 ls。實(shí)現(xiàn)的功能如下:l 支持 -l 參數(shù);l 輸出結(jié)果按字典排序;l 列出“.”文件,支持-a參數(shù),在沒有-a時(shí)候不顯示隱藏文件;l 顯示記錄總數(shù)。l 支持對(duì)給定的目錄進(jìn)行操作,如 ls /tmp;l 輸出結(jié)果分欄排序,每欄的寬度由這一欄最長(zhǎng)的文件名決定,顯示的欄數(shù)還受終端顯示器的寬度影響,每一列盡可能的等寬;l 正確顯示文件特殊屬性suid、sgid和sticky,參見聯(lián)機(jī)幫助確保程序能處理各種情況;l 支持標(biāo)準(zhǔn)的ls支持選項(xiàng)-r,它的功能是遞歸地列出目錄中所有的文件包含子目錄中的文件;l 支持標(biāo)準(zhǔn)的ls支持選項(xiàng)-u,它會(huì)顯
3、示出文件的最后訪問時(shí)間,如果用了-u而不用-l,會(huì)有什么結(jié)果?2. 修改文件讀權(quán)限。當(dāng)關(guān)掉一個(gè)文件的讀權(quán)限,就不能打開這個(gè)文件來讀。如果從一個(gè)終端登錄,打開一個(gè)文件,保持文件的打開狀態(tài),然后從另外的終端登錄,去掉文件的讀權(quán)限,這時(shí)有什么事情會(huì)發(fā)生?編寫一個(gè)程序,先用open()打開一個(gè)文件,用read()讀一些內(nèi)容,調(diào)用sleep()等待20s以后,再讀一些內(nèi)容,從另外的終端,再等待的20s內(nèi)去掉文件的讀權(quán)限,這樣會(huì)有什么結(jié)果?3. 調(diào)試linux操作系統(tǒng)原理與應(yīng)用第8章文件系統(tǒng)p215 的例子4. 編寫內(nèi)核模塊顯示目錄或文件的信息。給內(nèi)核模塊傳入?yún)?shù)path,其中path為絕對(duì)路徑:l 當(dāng)p
4、ath為目錄時(shí),顯示目錄對(duì)應(yīng)的dentrey結(jié)構(gòu)中的相關(guān)信息(可打印的信息);l 當(dāng)path為文件時(shí),顯示文件對(duì)應(yīng)的indoe結(jié)構(gòu)中的相關(guān)信息(可打印的信息);l 當(dāng)路徑錯(cuò)誤時(shí),有錯(cuò)誤提示信息。三概要設(shè)計(jì)1功能模塊圖;處理命令行參數(shù)獲取命令行參數(shù)獲取屏幕寬度運(yùn)行命令處理路徑非法情況處理無路徑情況處理路徑為目錄的情況處理路徑為文件的情況(1)、實(shí)現(xiàn)ls(2) 、修改文件權(quán)限關(guān)閉文件讀取文件內(nèi)容睡眠20秒打開錯(cuò)誤,退出程序否讀取文件內(nèi)容是判斷文件是否存在運(yùn)行命令解鎖遍歷各超級(jí)塊的索引結(jié)點(diǎn)號(hào)遍歷系統(tǒng)中的超級(jí)塊加鎖(3) 、調(diào)試?yán)右瞥齼?nèi)核文件信息輸出目錄信息輸出打開文件或目錄非法路徑提示分析絕對(duì)路徑
5、插入內(nèi)核(4) 、內(nèi)核傳參2各個(gè)模塊詳細(xì)的功能描述。(1)、實(shí)現(xiàn)lsu 運(yùn)行命令:在終端下運(yùn)行程序。u 獲取屏幕寬度:調(diào)用系統(tǒng)函數(shù)ioctl(),獲取當(dāng)前終端的寬度。u 獲取命令行參數(shù):遍歷命令行獲取命令參數(shù)a、u、l、r及其組合,并存入params 數(shù)組中。u 處理命令行參數(shù):根據(jù)上一步得到的param 分析當(dāng)前運(yùn)行時(shí)的參數(shù)類型并記錄在paramflag中。u 處理無路徑情況:顯示當(dāng)前目錄的所有信息,并根據(jù)上一步得到的paramflag參數(shù)組合分類的顯示。u 處理路徑為目錄的情況:顯示該目錄的所有信息,并根據(jù)上一步得到的paramflag參數(shù)組合分類的顯示。u 處理路徑為文件的情況:顯示該文
6、件的所有信息,并根據(jù)上一步得到的paramflag參數(shù)組合分類的顯示。u 處理路徑非法情況:顯示錯(cuò)誤提示并退出程序。(2) 、修改文件權(quán)限u 打開文件:文件不存在則報(bào)錯(cuò),文件存在則進(jìn)行操作。當(dāng)修改權(quán)限之后,再次打開文件并進(jìn)行操作。u 讀取文件內(nèi)容:成功打開文件則讀取文件中存在的數(shù)據(jù)。在睡眠前后都進(jìn)行讀取文件內(nèi)容。u 睡眠:在第一次讀取文件內(nèi)容之后睡眠20秒,方便進(jìn)行修改權(quán)限操作。(3) 、調(diào)試?yán)觰 加、解鎖:在對(duì)超級(jí)塊操作前,加鎖防止系統(tǒng)其他進(jìn)程對(duì)超級(jí)塊進(jìn)行修改;在操作完成后解鎖。u 獲取超級(jí)塊信息:遍歷超級(jí)塊,獲取超級(jí)塊的基本信息并輸出。u 打印各超級(jí)塊的索引結(jié)點(diǎn)號(hào):遍歷各超級(jí)塊中的索引結(jié)
7、點(diǎn)并輸出相關(guān)信息。(4)、內(nèi)核傳參u 文件操作:對(duì)由命令傳入的絕對(duì)路徑對(duì)應(yīng)的目錄或文件進(jìn)行打開操作。u 獲取dentry結(jié)構(gòu)體的信息:若絕對(duì)路徑指向的是目錄,則打印其dentry結(jié)構(gòu)體中的相關(guān)信息。u 獲取inode結(jié)構(gòu)體的信息:若絕對(duì)路徑指向的是文件,則打印其dentry結(jié)構(gòu)體中的相關(guān)信息。四詳細(xì)設(shè)計(jì)1功能函數(shù)的調(diào)用關(guān)系圖(1)、實(shí)現(xiàn)lshasdirs()showfileinfo()showfilename()disposeparam()compareu()compare()dirread()main()其中:void dirread( int, char * ):讀取目錄下文件和子目錄的內(nèi)
8、容信息。int compare( const void *, const void * ):按字典順序排序。int compareu( const void *, const void * ):在有-u而沒有-l的情況下,按最近時(shí)間由近到遠(yuǎn)的順序排序。void disposeparam( int, char * ):根據(jù)參數(shù)的種類,分類對(duì)該目錄或文件進(jìn)行不同的顯示操作。int hasdirs( char * ):判斷當(dāng)前獲取的子目錄路徑是否之前被找到。void showfilename( char * ):顯示文件名。void showfilesinfo( struct stat, char
9、*, int ):顯示文件的詳細(xì)信息。close()sleep()read()open()(2) 、修改文件權(quán)限其中:open():調(diào)用文件操作函數(shù),打開文件返回文件描述符。read():調(diào)用文件操作函數(shù),讀取文件中的內(nèi)容。sleep():調(diào)用線程操作函數(shù),是程序睡眠20秒,等待修改權(quán)限。close():調(diào)用文件操作函數(shù),關(guān)閉文件。(3)、調(diào)試?yán)觭pin_unlock()list_entry()list_for_eachspin_lock()其中:spin_lock():加鎖操作,在對(duì)超級(jí)塊操作前,加鎖防止系統(tǒng)其他進(jìn)程對(duì)超級(jí)塊進(jìn)行修改。list_for_each:鏈表宏定義,用來遍歷鏈表,鏈
10、表中存放個(gè)超級(jí)塊的地址。list_entry():獲取超級(jí)塊的地址。spin_unlock():解鎖操作。(4) 、內(nèi)核傳參path_exit()showdirinfo()showfileinfo()openfile()path_init()其中:static _init int path_init( void ):插入內(nèi)核時(shí)系統(tǒng)調(diào)用該函數(shù)對(duì)其初始化。static int openfile( char * ):自定義函數(shù),根據(jù)插入內(nèi)核時(shí)傳入的參數(shù),打開相應(yīng)的路徑獲取信息。static int showfileinfo( void ):說明路徑指向的是文件,并輸出文件inode結(jié)構(gòu)體中的信息。s
11、tatic int showdirinfo( void ):說明路徑指向的是目錄,并輸出目錄dentry結(jié)構(gòu)體中的信息。static _exit void path_exit( void ):移除內(nèi)核時(shí)系統(tǒng)調(diào)用該函數(shù)輸出相應(yīng)信息。showfileinfo()(是)傳參:文件狀態(tài)stat、文件名、有參數(shù)u標(biāo)志有參數(shù)-lshowfilename()(否)傳入?yún)?shù):文件名參數(shù)有-r,傳入?yún)?shù):當(dāng)前找到的子目錄的完整路徑hasdir()(否)顯示目錄下的文件名,傳參:命令行參數(shù)、文件路徑(是)傳參:命令行參數(shù)、子目錄完整路徑有-r有-u無-lcompare()(否)compareu()(是)dispo
12、separam()(文件)傳參:命令參數(shù)、路徑dirread()(無路徑、目錄)傳參:命令參數(shù)、路徑判斷路徑main()2各功能函數(shù)的數(shù)據(jù)流程圖(1)、實(shí)現(xiàn)lsclose()sleep()read()open()傳參:文件描述符、存儲(chǔ)讀取文件內(nèi)容的buf、讀取文件長(zhǎng)度程序睡眠20秒睡眠結(jié)束,繼續(xù)讀文件內(nèi)容,傳參:文件描述符、存儲(chǔ)讀取文件內(nèi)容的buf、讀取文件長(zhǎng)度關(guān)閉文件再次打開文件,查看權(quán)限(2) 、修改文件權(quán)限(3) 、調(diào)試?yán)觭pin_unlock()list_entry()list_for_eachspin_lock()插入內(nèi)核需要參數(shù):sb_lock_address 傳參:鏈表結(jié)點(diǎn),超
13、級(jí)塊地址鏈表頭 傳參:鏈表頭、超級(jí)塊類型、存儲(chǔ)所有超級(jí)塊信息的鏈表遍歷各超級(jí)塊的索引號(hào)節(jié)點(diǎn)并獲取索引結(jié)點(diǎn)的信息(4)、內(nèi)核傳參路徑非法,顯示錯(cuò)誤信息path_exit()showdirinfo()showfileinfo()openfile()path_init()傳參:絕對(duì)路徑文件目錄路徑3重點(diǎn)設(shè)計(jì)及編碼(1)、實(shí)現(xiàn)lsu 在只有-u的情況下按照最后訪問時(shí)間由近到遠(yuǎn)排序,調(diào)用的是系統(tǒng)排序方法qsort( filepaths, count, sizeof( filepaths 0 ), compareu );其中compareu()是自定義的排序函數(shù)。int compareu( const v
14、oid *first, const void *last )struct stat buf1, buf2;stat( ( char * )first, &buf1);stat( ( char * )last, &buf2);return ( ( int )buf2.st_atime - ( int )buf1.st_atime );u 實(shí)現(xiàn)-r的功能。在void disposeparam( int paramflag, char *filepath )函數(shù)中查找當(dāng)前目錄下存在的子目錄。if ( ( paramflag = 8 ) & s_isdir( buf.st_mode ) & strcm
15、p( filename, . ) & strcmp( filename, . ) & hasdirs( filepath ) = 0 )/ 判斷為目錄時(shí)過濾.和.并且若該目錄沒有被找出strcpy( dirpath dircount , filepath );hasdir = 1;/ 標(biāo)志,在當(dāng)前目錄下找到子目錄dircount+;/ 更新子目錄數(shù)然后再void dirread( int paramflag, char *path )函數(shù)中遞歸調(diào)用自身來顯示子目錄的相關(guān)內(nèi)容。if ( paramflag = param_r & hasdir = 1 )/ 將子目錄的hasdir標(biāo)志位置0,表示
16、子目錄下還未找到其子目錄hasdir = 0;for ( dirshow; dirshow dircount; )/ -l輸出總用量置0,-a分欄寬度置maxchar,遞歸調(diào)用自身total = 0;restlen = line;printf( n%s:n, dirpath dirshow );dirread( paramflag, dirpath dirshow+ );(2)、內(nèi)核傳參u 判斷路徑指向的文件類型:file = filp_open( path, o_directory, 0 );if ( is_err( file ) )/ 不成功則以文件形式打開file = filp_open
17、( path, o_rdonly, 0444 );if ( is_err( file ) )/ 路徑錯(cuò)誤printk( the paht %s failed!n, path );return 0;/ 該路徑指向一個(gè)文件printk( this is file!n );showfileinfo();filp_close( file, null );return 0;else/ 該路徑指向一個(gè)目錄printk( this is diretory!n );showdirinfo();filp_close( file, null );return 0;五測(cè)試數(shù)據(jù)及運(yùn)行結(jié)果1正常測(cè)試數(shù)據(jù)和運(yùn)行結(jié)果(1)
18、、實(shí)現(xiàn)lsu 無參有路徑的情況:u 無參數(shù)的情況、只有-a的情況、只有-u的情況:有上述的情況可以看出:如果用了-u而不用-l,輸出的文件名會(huì)按最后訪問時(shí)間由近到遠(yuǎn)的順序而不是按字典順序排序。u 對(duì)比-l和-lu的輸出不同情況:不同之處在于輸出的時(shí)間,-l輸出最近修改時(shí)間,-lu輸出最近訪問時(shí)間。并且在-l的情況下會(huì)輸出三個(gè)特殊屬性sgid、suid、sticky位。u -r的情況:遞歸顯示子目錄信息u -aulr組合情況:(2) 、修改文件權(quán)限調(diào)用sleep()等待20s以后,再讀一些內(nèi)容,從另外的終端,再等待的20s內(nèi)去掉文件的讀權(quán)限,但是程序還是能從文件中讀取出內(nèi)容。當(dāng)再一次打開文件時(shí)由
19、于無權(quán)限,文件打開錯(cuò)誤。(3) 、調(diào)試?yán)觰 查看程序中涉及的兩個(gè)全局變量:cat /proc/kallsyms | grep super_blocks結(jié)果:ffffffff81c4f3c0 d super_blockscat /proc/kallsyms | grep super_blocks結(jié)果:ffffffff81f027a0 b sb_lock u 運(yùn)行結(jié)果:(部分內(nèi)容)(4) 、內(nèi)核傳參u 當(dāng)路徑指向文件時(shí),顯示文件inode信息:當(dāng)路徑指向目錄時(shí),顯示目錄dentry信息:2異常測(cè)試數(shù)據(jù)及運(yùn)行結(jié)果(1)、實(shí)現(xiàn)ls(2)、修改文件權(quán)限(3)、內(nèi)核傳參六調(diào)試情況,設(shè)計(jì)技巧及體會(huì)1改進(jìn)方
20、案本次實(shí)驗(yàn)完成的很不錯(cuò)。在實(shí)現(xiàn)ls的功能中,完成了所有的要求,可以改進(jìn)的地方有:將分欄情況模擬成系統(tǒng)顯示的效果(以列為主,以各列的文件名最大值為欄寬),而不是簡(jiǎn)單的以行為主,以所有的文件名中最大值為欄寬;使用-r參數(shù)時(shí),應(yīng)使用鏈表結(jié)構(gòu)而不是數(shù)組結(jié)構(gòu),這樣不會(huì)因?yàn)檫f歸太深,子目錄太多而造成的越界現(xiàn)象。在實(shí)現(xiàn)內(nèi)核傳遞參數(shù)的功能中,完成了所有的功能,可以的改進(jìn)的地方就是盡可能的輸出有用的信息。2體會(huì)通過本次實(shí)驗(yàn),我實(shí)現(xiàn)了ls這個(gè)shell命令,為之后設(shè)計(jì)操作系統(tǒng)打下基礎(chǔ);通過控制文件的訪問權(quán)限我理解了文件操作的工作原理;編寫內(nèi)核代碼讓我掌握了通過命令傳入?yún)?shù)的方法。通過上網(wǎng)查找資料、查看課本等途徑,
21、讓我的自學(xué)能力更進(jìn)一步,對(duì)linux和操作系統(tǒng)的知識(shí)理解得更加的深入。七參考文獻(xiàn)1linux操作系統(tǒng)原理與應(yīng)用m. 陳莉君,康華編著. 第二版. 北京:清華大學(xué)出版社,2012.2 美m(xù)olay.b 著. unix/linux編程實(shí)踐教程m. 楊宗源,黃海濤譯. 北京:清華大學(xué)出版社,2004.3 鳥哥. 鳥哥的linux私房菜m. 王世江,改編. 第三版. 北京:人民郵電出版社,2011.八附錄:1.ls#include #include #include #include #include #include #include #include #include #include #defi
22、neparam_none0/ 無參數(shù)#defineparam_a1/ -a: 顯示所有文件#defineparam_l2/ -l:一行顯示一個(gè)文件的詳細(xì)信息#define param_u4/ -u:顯示文件最后一次訪問時(shí)間#define param_r8/ -r:遞歸顯示文件與子目錄及其內(nèi)容#define pathcount10/ 遞歸顯示目錄功能中子目錄的數(shù)量int restlen = 0;/ -l打印詳細(xì)信息時(shí)一行剩余長(zhǎng)度int maxfilelen = 0;/ 存放某目錄下最長(zhǎng)的文件名的長(zhǎng)度int total = 0;/ -l顯示的總用量int hasdir = 0;/ -r中標(biāo)志位,在
23、當(dāng)前目錄下是否找到子目錄int dircount = 0;/ -r中目前遞歸找到的子目錄的數(shù)量int dirshow = 0;/ -r已顯示相關(guān)信息的子目錄的數(shù)量int line = 0;/ 屏幕的寬度char dirpath pathcount path_max + 1 = 0 ;/ -r中存儲(chǔ)子目錄路徑void dirread( int, char * );int compare( const void *, const void * );int compareu( const void *, const void * );void disposeparam( int, char * );
24、int hasdirs( char * );void showfilename( char * );void showfilesinfo( struct stat, char *, int );int main( int argc, char * argv )int i, j, k;int paramcount, paramflag;char path path_max + 1 ;/ 保存命令行中路徑char params 20 ;/ 存儲(chǔ)參數(shù)struct stat st;struct winsize size;j = 0;paramcount = 0;/ 帶參數(shù)的命令行數(shù)量paramflag
25、 = param_none;/ 參數(shù)標(biāo)志位,初始無餐/ 獲取屏幕寬度ioctl(stdout_fileno, tiocgwinsz, &size);line = size.ws_col;restlen = line;/ 讀取命令行中的參數(shù)for ( i = 1; i argc; i+ ) if ( argv i 0 = - ) for ( k = 1; k strlen( argv i ); k+, j+ )params j = argv i k ;paramcount+;params j = 0;/ 判斷當(dāng)前命令的參數(shù),更新參數(shù)標(biāo)記位for (i = 0; i j; i+) switch(
26、params i )case a:paramflag |= param_a;break;case l:paramflag |= param_l;break;case u:paramflag |= param_u;break;case r:paramflag |= param_r;break;default:printf( 有未知的參數(shù)存在!n );return 0;/ 沒有路徑,顯示當(dāng)前目錄if ( ( paramcount + 1 ) = argc ) strcpy( path, ./0 );dirread( paramflag, path );return 0;/ 有路經(jīng),判斷路徑非法、是
27、目錄、是文件i = 1 + paramcount;do strcpy( path, argvi );if ( stat( path, &st ) = -1 )/ 路徑非法printf( 目標(biāo)文件或目錄%s不存在!n, path );return 0;/ 路徑為目錄if ( s_isdir( st.st_mode ) ) dirread( paramflag, path );else/ 路徑為文件disposeparam( paramflag, path );i+; while (i pw_name );/ 打印所有者的用戶名printf( %6s, grp-gr_name );/ 打印組名pr
28、intf( %7ld , (long)buf.st_size ); / 打印文件的大小 if ( hasu = 0 )strcpy( buf_time, ctime( &buf.st_mtime ) );/ 最后一次修改時(shí)間elsestrcpy( buf_time, ctime( &buf.st_atime ) );/ 最后一次訪問時(shí)間buf_time strlen( buf_time ) - 1 = 0;/ 去掉換行符printf( %s, buf_time );/ 打印文件的時(shí)間信息printf( %sn, filename );/ 打印文件名字total += (int)buf.st_b
29、locks;/ 計(jì)算當(dāng)前目錄所有文件的總用量/ 沒有-l,只打印文件名并分欄對(duì)齊void showfilename( char *filename )int i, len;/ 本行剩余長(zhǎng)度不足已顯示下一個(gè)文件名,換行if ( restlen maxfilelen ) printf( n );restlen = line;/ 打印文件名并分欄len = maxfilelen - strlen( filename );/ 當(dāng)前顯示欄的剩余長(zhǎng)度printf( %s , filename );/ 打印文件名if ( (int)* filename 0 )/ 文件名若為中文len += 2;for (
30、i = 0; i len; i+ )/ 當(dāng)前欄剩余處打印空格printf( );restlen -= ( maxfilelen );/ 更新當(dāng)前行的剩余長(zhǎng)度/ -r下判斷是否已知參數(shù)路徑為一個(gè)目錄路徑int hasdirs( char *filepath )int i;for ( i = 0; i dircount; i+)if ( strcmp( filepath, dirpath i ) = 0 )return 1;return 0;/ 分析參數(shù)并分別執(zhí)行不同的操作void disposeparam( int paramflag, char *filepath )struct stat b
31、uf;int i, j, hasu;char filename name_max + 1 ;/ 存儲(chǔ)文件名hasu = 0;/ 從完整路徑中解析文件名for ( i = 0, j = 0; i = 8 ) & s_isdir( buf.st_mode ) & strcmp( filename, . ) & strcmp( filename, . ) & hasdirs( filepath ) = 0 )/ 判斷為目錄時(shí)過濾.和.并且若該目錄沒有被找出strcpy( dirpath dircount , filepath );hasdir = 1;/ 標(biāo)志,在當(dāng)前目錄下找到子目錄dircount
32、+;/ 更新子目錄數(shù)/ 對(duì)參數(shù)分類操作if ( paramflag = 0 | paramflag = 4 | paramflag = 8 | paramflag = 12)/ paramflag為下列情況:param_none,param_u,param_r,param_u + param_rif ( filename 0 != . ) showfilename( filename );else if ( paramflag = 1 | paramflag = 5 | paramflag = 9 | paramflag = 13)/ paramflag為下列情況:param_a,param_
33、a + param_u,param_a + param_r,param_a + param_u + param_rshowfilename( filename );else if ( paramflag = 2 | paramflag = 10 )/ paramflag為下列情況:param_l,param_l + param_rif ( filename 0 != . ) showfilesinfo( buf, filename, hasu );else if ( paramflag = 3 | paramflag = 11 )/ paramflag為下列情況:param_a + param
34、_l,param_a + param_l + param_rshowfilesinfo( buf, filename, hasu );else if ( paramflag = 6 | paramflag = 14 )/ paramflag為下列情況:param_l + param_u,param_l + param_u + param_rhasu = 1;if ( filename 0 != . )showfilesinfo( buf, filename, hasu );else if ( paramflag = 7 | paramflag = 15 )/ paramflag為下列情況:pa
35、ram_a + param_l + param_u,param_l + param_u + param_a + param_rhasu = 1;showfilesinfo( buf, filename, hasu );elseprintf( 參數(shù)出現(xiàn)錯(cuò)誤匹配或存在未知參數(shù)!n );exit( 0 );/ 調(diào)用系統(tǒng)排序函數(shù),按字典順序排序int compare( const void *first, const void *last )return strcmp( (char *)first, (char *)last );/ 調(diào)用系統(tǒng)排序函數(shù),按最近訪問時(shí)間排序int compareu( co
36、nst void *first, const void *last )struct stat buf1, buf2;stat( ( char * )first, &buf1);stat( ( char * )last, &buf2);return ( ( int )buf2.st_atime - ( int )buf1.st_atime );/ 讀取當(dāng)前目錄下的內(nèi)容void dirread( int paramflag, char *path ) struct dirent *dt;/ 獲取文件的信息dir *dir;/ 目錄流 int i, j, count;char filepaths 2
37、56 path_max + 1 = ;/ 存儲(chǔ)文件的完整路徑count = 0;/ 記錄當(dāng)前目錄下包含的文件和子目錄的名字maxfilelen = 0;/ 初始化當(dāng)前目錄下文件名的最大值/ 完善完整路徑,若目錄的最后一個(gè)字符不是/,則加上if ( path strlen(path)-1 != /) strcat( path, / );strcat( path, 0 );/ 打開目錄,遍歷目錄下的文件并獲取其信息 dir = opendir( path ); while ( ( dt = readdir( dir ) ) != null ) if ( maxfilelen d_name ) )m
38、axfilelen = strlen( dt-d_name ) + 1; count+; closedir( dir );/ 關(guān)閉目錄流/ 打開目錄,獲取該目錄下所有的文件名的完整路徑 dir = opendir( path );/再次打開路徑 for ( i = 0; i d_name ); filepaths i strlen( path ) + strlen( dt-d_name ) = 0; closedir( dir );/ 調(diào)用系統(tǒng)排序方法排序/ 所有有-u但沒有-l的時(shí)候按照最近訪問時(shí)間排序,其他按字典排序if ( ( paramflag & param_u ) = 4 & (
39、paramflag & param_l ) = 0 )qsort( filepaths, count, sizeof( filepaths 0 ), compareu );elseqsort( filepaths, count, sizeof( filepaths 0 ), compare );/ 逐個(gè)顯示該目錄下的文件或子目錄的信息 for ( i = 0; i = param_r & hasdir = 1 )/ 將子目錄的hasdir標(biāo)志位置0,表示子目錄下還未找到其子目錄hasdir = 0;for ( dirshow; dirshow dircount; )/ -l輸出總用量置0,-a
40、分欄寬度置maxchar,遞歸調(diào)用自身total = 0;restlen = line;printf( n%s:n, dirpath dirshow );dirread( paramflag, dirpath dirshow+ );2. 文件權(quán)限#include #include #include #include void main( int argc, char *argv )int fd, n;char buf 15 ;/ 沒有輸入目標(biāo)文件if ( argc = 1 )printf( 輸入錯(cuò)誤,請(qǐng)按照如下格式:n./my_file 文件名或文件路徑n );exit( 0 );/ 第一次打
41、開文件fd = open( argv1, o_rdonly );if ( fd = -1 )printf( 文件打開錯(cuò)誤,文件權(quán)限不夠或不存在!n );exit( 0 );/ 首次讀取文件的內(nèi)容printf( 第一次打開文件操作n );n = read( fd, buf, 10 );buf n = 0;printf( no.1 讀取了%d字節(jié)的數(shù)據(jù):%s, n, buf );printf( 修改文件權(quán)限n );sleep( 20 );/ 睡眠20秒/ 再次讀取文件內(nèi)容printf( n睡眠10秒結(jié)束n );n = read( fd, buf, 10 );buf n = 0;printf( no.2 讀取了
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《班組安全教育課程》課件
- 單位管理制度集粹選集【員工管理】十篇
- 單位管理制度合并選集【人力資源管理】十篇
- 七年級(jí)下《皇帝的新裝》蘇教版-課件
- 單位管理制度范例匯編【職員管理篇】十篇
- 《標(biāo)準(zhǔn)化裝修》課件
- 《項(xiàng)目管理手冊(cè)》附件1至附件123
- (高頻非選擇題25題)第1單元 中華人民共和國(guó)的成立和鞏固(解析版)
- 2019年高考語(yǔ)文試卷(新課標(biāo)Ⅰ卷)(解析卷)
- 2015年高考語(yǔ)文試卷(新課標(biāo)Ⅱ卷)(解析卷)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之14:“6策劃-6.3變更的策劃”(雷澤佳編制-2025B0)
- 2024年特厚板行業(yè)現(xiàn)狀分析:中國(guó)特厚板市場(chǎng)占總銷售量45.01%
- 2024版影視制作公司與演員經(jīng)紀(jì)公司合作協(xié)議3篇
- 2024年上海市初三語(yǔ)文二模試題匯編之記敘文閱讀
- 2024年度上海市嘉定區(qū)工業(yè)廠房買賣合同2篇
- 2023-2024學(xué)年廣東省廣州市海珠區(qū)九年級(jí)(上)期末化學(xué)試卷(含答案)
- 音樂老師年度總結(jié)5篇
- 自動(dòng)控制理論(哈爾濱工程大學(xué))知到智慧樹章節(jié)測(cè)試課后答案2024年秋哈爾濱工程大學(xué)
- 探索2024:財(cái)務(wù)報(bào)表分析專業(yè)培訓(xùn)資料
- 雙減背景下基于核心素養(yǎng)小學(xué)語(yǔ)文閱讀提升實(shí)踐研究結(jié)題報(bào)告
- 心電圖使用 課件
評(píng)論
0/150
提交評(píng)論