Chapter3-目錄與文件屬性_第1頁
Chapter3-目錄與文件屬性_第2頁
Chapter3-目錄與文件屬性_第3頁
Chapter3-目錄與文件屬性_第4頁
Chapter3-目錄與文件屬性_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Unix/Linux編程北京化工大學(xué)信息科學(xué)與技術(shù)學(xué)院計算機系易軍凱第第3章章 目錄與文件屬性:編寫目錄與文件屬性:編寫ls概念與技巧概念與技巧l目錄是文件的列表l如何讀取目錄的內(nèi)容l文件類型以及如何知道文件的類型l文件屬性以及如何知道文件的屬性l位操作及掩碼的使用l用戶與組ID及passwd數(shù)據(jù)庫 相關(guān)系統(tǒng)調(diào)用與函數(shù)相關(guān)系統(tǒng)調(diào)用與函數(shù)lopendir 、readdir、closedir、seekdirlstatlchmod、chown、utimelrename相關(guān)命令相關(guān)命令lls主要內(nèi)容:l3.1 介紹l3.2 關(guān)于ls命令的3個問題 l3.3 編寫ls -1 l3.4 三個特殊的位l3.

2、5 ls小結(jié) l3.6 設(shè)置和修改文件的屬性l 已經(jīng)介紹了如何讀/寫文件內(nèi)容的方法。除了內(nèi)容之外,文件還有很多屬性,比如文件所有者、最好修改時間、文件大小、類型等。文件名在目錄中列出,正如電話號碼簿中列出的人名一樣。如何讀取文件名和文件的屬性呢?l Ls命令可以列出目錄中所有文件的名字,以及這些文件的其它信息。本章通過分析ls命令來學(xué)習(xí)目錄和文件的類型與屬性。3.1 3.1 介紹介紹3.2.1 L s命令能做什么?3.2.2 L s是如何工作的?3.2.3 如何編寫L s?3.2 3.2 關(guān)于關(guān)于ls的三個問題的三個問題3.2.1 ls命令能做什么?lls命令可以列出目錄中所有文件的名字,以及

3、這些文件的其它信息。lsls /tmpls /hello.cls lls l /etcls l hello.c目錄文件列出詳細信息如果參數(shù)是目錄,ls列出目錄的內(nèi)容;如果參數(shù)是文件,ls列出文件名和屬性。l 經(jīng)常用到的命令行選項:ls - a 列出的內(nèi)容包含以“.”開頭的文件ls - lu 顯示最后訪問的時間ls - s 顯示以塊為單位的文件大小ls - t 輸出是按時間排序ls - F 顯示文件類型Unix中,中,ls一般不會列出以一般不會列出以.開始的文件,當(dāng)開始的文件,當(dāng)ls 加加-a后才列出。后才列出。l問題答案 ls命令做兩件事:列出目錄的內(nèi)容 顯示文件的信息 ls能判定參數(shù)指定的是

4、文件還是目錄,采取不同的操作。能判定參數(shù)指定的是文件還是目錄,采取不同的操作。l掌握三點編寫ls 如何列出目錄的內(nèi)容 如何讀取并顯示文件的屬性 判斷給出的名字是目錄還是文件目錄樹結(jié)構(gòu):磁盤上的文件和目錄被組成一棵目錄樹,每個節(jié)點都是目錄或文件。Unix系統(tǒng)中每個文件都位于某個目錄中,在邏輯上是沒有驅(qū)動器或卷的。這樣實現(xiàn)ls就只需考慮文件和目錄兩種情況,無需考慮驅(qū)動器和分區(qū)。大方框表示目錄,大方框內(nèi)的小方框表示文件,目錄之間的連線表示目錄之間的組織關(guān)系。3.2.2 L s是如何工作的?lLs產(chǎn)生一個文件名的列表,它大致是這樣工作的: Open directory +-read entry -en

5、d of dir-+ | display file info | _ Close directory -+ 上述邏輯與who的十分相似,主要的區(qū)別是who從文件中讀取數(shù)據(jù),而ls從目錄中讀取數(shù)據(jù),讀目錄與讀文件區(qū)別大嗎?目錄到底是什么呢?l什么是目錄? 目錄是一種特殊的文件,它的內(nèi)容是文件和目錄的名字。每個目錄都至少包含兩個特殊的項“.”和“.”,其中“.”表示當(dāng)前目錄,“.”表示上一級目錄。l是否可以用open、read和close來操作目錄 $ cat/ $ more/tmp $ od-c/dev 由例子可知: cat和和od可以打開目錄??梢源蜷_目錄。 more可以區(qū)分出文件和目錄,拒絕

6、對目錄操作??梢詤^(qū)分出文件和目錄,拒絕對目錄操作。 目錄內(nèi)不是無格式的文本而是包含一定的數(shù)據(jù)結(jié)構(gòu)。目錄內(nèi)不是無格式的文本而是包含一定的數(shù)據(jù)結(jié)構(gòu)。 l如何讀目錄的內(nèi)容? $man k direct $man k direct | grep read Answer: opendir(),readdir(),closedir()從目錄中讀到一項從目錄中讀到一項3.2.3 如何編寫ls?lls的算法如下: main() opendir while(readdir) print d_name closedir還能做什么?l 排序 把所有文件名讀入一個數(shù)組,用qsort函數(shù)把數(shù)組排序l 分欄 先把文件名讀

7、入數(shù)組,然后計算出列的寬度和行數(shù)l “.”文件 使lsl能夠接受選項-a,并在沒有-a的時候不顯示隱藏文件l 選項 ll列出文件內(nèi)容 模式、鏈接數(shù)、文件所有者、組、大小、最后修改時間、文件名l顯示文件的詳細信息 $ man k file | grep i information Answer:使用系統(tǒng)調(diào)用stat3.3 3.3 編寫編寫ls -13.3.1 ls做的兩件事3.3.2 用stat讀取文件的屬性:Stat目標(biāo)得到文件的屬性頭文件#include函數(shù)原型Int result=stat(char*fname,struct stat *bufp)參數(shù)Fname 文件名Bufp 指向buf

8、fer的指針返回值-1 遇到錯誤0 成功返回stat提供的其他信息:lSt_mode 文件類型和許可權(quán)限lSt_uid 用戶所有者的IDlSt_gid 所屬組的IDlSt_size 所占的字節(jié)數(shù)lSt_nlink 文件鏈接數(shù)lSt_mtime 文件最后修改時間 文件名、文件大小、鏈接數(shù)都沒有問題;最后修改時間是time_t類型的,可以用ctime將其轉(zhuǎn)化成字符串用戶所有者和組字段都是數(shù)值,而顯示出來應(yīng)該是用戶名和組名。模式字段以數(shù)字形式輸出,然而需要的是如下形式:-rw-rw-r-3.3.3 如何實現(xiàn)文件類型與許可權(quán)限文件類型與許可權(quán)限4位用作文件類型,最多可以標(biāo)識16種類型接下來3位是文件特

9、殊屬性,1表示具有某個屬性,0代表沒有 3.3.4 將模式字段轉(zhuǎn)換成字符(1)字段的編碼:編碼的例子617-495-4204電話號碼027-93-1111社會保障號128.103.33.100IP地址將多種信息編碼到一個整數(shù)不同的不同字段中將多種信息編碼到一個整數(shù)不同的不同字段中(2)如何讀取被編碼的值l掩碼的概念掩碼會將不需要的字段置0,需要的字段的值不發(fā)生改變。l整數(shù)是bit組成的序列整數(shù)在計算機中是以bit序列形式存在的。圖3.5顯示了如何以二進制的0和1的串來表示十進制的215。 在整數(shù)和二進制數(shù)之間轉(zhuǎn)換在整數(shù)和二進制數(shù)之間轉(zhuǎn)換l掩碼技術(shù):與0作位與(&)操作可以將相應(yīng)的bit

10、位置為0 位與操作位與操作l使用八進制數(shù)將二進制數(shù)每三位分為一組來操作,這就是八進制數(shù)(0至7)。如可以把二進制的1000000110110100分為1,000,000,110,110,100 從而得到八進制的10064,這樣更容易理解。(3)使用掩碼來解碼得到文件類型if (info.st_mode & 0170000)=0040000) printf(“this is a directory”);(4)解碼得到許可權(quán)限if ( st_mode & 004 ) printf (“readable by others”);if ( st_mode & 002) prin

11、tf (“writable by others”);(5)解碼并編寫ls3.3.5 將用戶/組ID轉(zhuǎn)換成字符串l /etc / passwd 包含用戶列表l 通過getpwuid來得到完整的用戶列表 getpwuid需要UID作為參數(shù),返回一個指向struct passwd的指針。l 通過getgrgid來訪問組列表l UID沒有對應(yīng)的用戶名l /etc/group是組的列表l 用戶可以同時屬于多個組l 通過getgrgid來訪問組列表3.3.6 編寫ls2.cmain(int ac, char *av) if ( ac = 1 ) do_ls( . ); else while ( -ac )

12、printf(%s:n, *+av );do_ls( *av ); void do_ls (char dirname)void do_stat(char * filename)void show_file_info( char*filename,struct stat* info_p)void mode_to_letters (int mode,char str)char *uid_to_name (uid_t uid )char *gid_to_name (gid_t gid )比較ls2的輸出與標(biāo)準(zhǔn)的ls對比lLs2中,模式字段、用戶名和組名的處理已經(jīng)完成,但是標(biāo)準(zhǔn)的ls會顯示記錄總數(shù),l

13、s2不會,而且ls2還沒將結(jié)果按文件名排序,也不支持選項-a,它還假設(shè)參數(shù)是目錄名。lLs2還有一個致命的問題,不能顯示指定目錄的信息,例如ls2/tmp。1、set-user-ID位:用于用戶更改自己的密碼 $ls l /usr / etc/ passwd -rw-r-r- 1 root root 894 Jun 20 19:17 /etc/ passwd 更改密碼文件內(nèi)容會發(fā)生變化,但普通用戶沒有修改文件的權(quán)限,只有root用戶可以修改, passwd命令怎么修改這個文件? 3.4 3.4 三個特殊的位三個特殊的位Answer :給passwd命令一個特殊的權(quán)限,使 passwd命令的文件

14、所有者是root,其特殊屬性中包含set-user-ID位. $ ls l/user/bin/passwd -r-sr-xr-x 1 root bin 15725 0ct 31 1997 /usr / bin / passwdl 是否可以更改其它用戶的密碼?l set-user-ID的其它用處l 檢驗SUID位的掩碼#define S_ISUID 0004000幾個問題:幾個問題:2、set-group-ID位:用來設(shè)置程序運行時所 屬組??梢越o程序某一個組的訪問權(quán)限。 #define S_ISGID 0002000 3、sticky位l對于文件而言,早期的UNIX系統(tǒng)經(jīng)常要在有限的內(nèi)存中同時

15、運行很多程序,它使用到交換(swap)技術(shù)?,F(xiàn)在,取而代之的是虛擬內(nèi)存技術(shù)。l從交換空間裝載程序要比從普通的硬盤空間快,交換空間上的文件是不分快的。l對于目錄而言,sticky位使得目錄里的文件只能被創(chuàng)建者刪除。l文件與目錄l用戶與組l文件屬性l文件的所有關(guān)系l許可權(quán)限3.5 3.5 ls小結(jié)小結(jié)l文件類型 (1)文件類型的建立:在創(chuàng)建文件的時候建立 (2)修改文件類型:文件一經(jīng)創(chuàng)建,類型就無法修改l許可位與特殊屬性位:在文件創(chuàng)建時建立,創(chuàng)建以后,可以被chmod系統(tǒng)調(diào)用修改。 (1)建立文件模式 fd = creat (“newfile”, 0744 )3.6 3.6 設(shè)置和修改文件的屬性設(shè)

16、置和修改文件的屬性(2)改變文件模式 chmod( “/tmp/myfile”,04764); 函數(shù)原型:int result = chmod (char * path , mode_t mode); 返回值:-1 遇到錯誤 0 成功返回(3)用來修改文件的許可權(quán)限和特殊屬性的命令l 文件的鏈接數(shù)鏈接數(shù)就是文件被引用的次數(shù)。下一章詳細討論。l 文件所有者與組 (1)修改文件所有者與組: chown (“filel” , 200 , 40 ); /*將文件filel的用戶ID改為200,組ID改為40*/ (2)用來修改文件所有者和組的命令: shell命令chown和chgrp可以用來修飾文件

17、 所有者和組,詳細使用說明參見聯(lián)機幫助。l文件大小 當(dāng)向文件添加內(nèi)容時,文件的大小會自動增加,可以使用系統(tǒng)調(diào)用creat把文件大小置為0。不存在能夠直接減小文件占有的空間的函數(shù)。l 時間 (1)修改最后修改時間和最后訪問時間 int utime ( char *path , struct utimbuf * newtimes)參數(shù):path 文件名 newtimes 指向結(jié)構(gòu)變量utimbuf的指針 (2)用命令修改最后修改時間和最后訪問時間 shell命令touch可以完成此功能,詳細信息參見聯(lián)機幫助。l 文件名:創(chuàng)建文件時會指定一個文件名。命令mv可以改變一個文件的名字,也可以把文件從一個地方移動到另一個地方。(1)文件名的建立 系統(tǒng)調(diào)用creat指定文件模式的同時會指定文件的名字。(2)修改文件名 系統(tǒng)調(diào)用rename可以修改文件/目錄的名字,還可以移動文件的位置,他又倆個參數(shù),原文件名和新的文件名。rename目標(biāo)修改文件名或移動文件的位置頭文件#include函數(shù)原型int result = rename( char * old, char *new)參數(shù)old原來的文件名或目錄名new新的文件名或目錄名返回值-1遇到錯誤0成功返回小結(jié)l主要內(nèi)容(1)磁盤上有文件和目錄,文件和目錄都有內(nèi)容和屬性。文件的內(nèi)容可以是任意的數(shù)據(jù),目

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論