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

下載本文檔

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

文檔簡(jiǎn)介

1、Unix/Linux編程北京化工大學(xué)信息科學(xué)與技術(shù)學(xué)院計(jì)算機(jī)系易軍凱第第3章章 目錄與文件屬性:編寫目錄與文件屬性:編寫ls概念與技巧概念與技巧l目錄是文件的列表l如何讀取目錄的內(nèi)容l文件類型以及如何知道文件的類型l文件屬性以及如何知道文件的屬性l位操作及掩碼的使用l用戶與組ID及passwd數(shù)據(jù)庫(kù) 相關(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個(gè)問(wèn)題 l3.3 編寫ls -1 l3.4 三個(gè)特殊的位l3.

2、5 ls小結(jié) l3.6 設(shè)置和修改文件的屬性l 已經(jīng)介紹了如何讀/寫文件內(nèi)容的方法。除了內(nèi)容之外,文件還有很多屬性,比如文件所有者、最好修改時(shí)間、文件大小、類型等。文件名在目錄中列出,正如電話號(hào)碼簿中列出的人名一樣。如何讀取文件名和文件的屬性呢?l Ls命令可以列出目錄中所有文件的名字,以及這些文件的其它信息。本章通過(guò)分析ls命令來(lái)學(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的三個(gè)問(wèn)題的三個(gè)問(wèn)題3.2.1 ls命令能做什么?lls命令可以列出目錄中所有文件的名字,以及

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

4、文件還是目錄,采取不同的操作。能判定參數(shù)指定的是文件還是目錄,采取不同的操作。l掌握三點(diǎn)編寫ls 如何列出目錄的內(nèi)容 如何讀取并顯示文件的屬性 判斷給出的名字是目錄還是文件目錄樹結(jié)構(gòu):磁盤上的文件和目錄被組成一棵目錄樹,每個(gè)節(jié)點(diǎn)都是目錄或文件。Unix系統(tǒng)中每個(gè)文件都位于某個(gè)目錄中,在邏輯上是沒(méi)有驅(qū)動(dòng)器或卷的。這樣實(shí)現(xiàn)ls就只需考慮文件和目錄兩種情況,無(wú)需考慮驅(qū)動(dòng)器和分區(qū)。大方框表示目錄,大方框內(nèi)的小方框表示文件,目錄之間的連線表示目錄之間的組織關(guān)系。3.2.2 L s是如何工作的?lLs產(chǎn)生一個(gè)文件名的列表,它大致是這樣工作的: 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)容是文件和目錄的名字。每個(gè)目錄都至少包含兩個(gè)特殊的項(xiàng)“.”和“.”,其中“.”表示當(dāng)前目錄,“.”表示上一級(jí)目錄。l是否可以用open、read和close來(lái)操作目錄 $ cat/ $ more/tmp $ od-c/dev 由例子可知: cat和和od可以打開目錄??梢源蜷_目錄。 more可以區(qū)分出文件和目錄,拒絕

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

7、入數(shù)組,然后計(jì)算出列的寬度和行數(shù)l “.”文件 使lsl能夠接受選項(xiàng)-a,并在沒(méi)有-a的時(shí)候不顯示隱藏文件l 選項(xiàng) ll列出文件內(nèi)容 模式、鏈接數(shù)、文件所有者、組、大小、最后修改時(shí)間、文件名l顯示文件的詳細(xì)信息 $ 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的指針?lè)祷刂?1 遇到錯(cuò)誤0 成功返回stat提供的其他信息:lSt_mode 文件類型和許可權(quán)限lSt_uid 用戶所有者的IDlSt_gid 所屬組的IDlSt_size 所占的字節(jié)數(shù)lSt_nlink 文件鏈接數(shù)lSt_mtime 文件最后修改時(shí)間 文件名、文件大小、鏈接數(shù)都沒(méi)有問(wèn)題;最后修改時(shí)間是time_t類型的,可以用ctime將其轉(zhuǎn)化成字符串用戶所有者和組字段都是數(shù)值,而顯示出來(lái)應(yīng)該是用戶名和組名。模式字段以數(shù)字形式輸出,然而需要的是如下形式:-rw-rw-r-3.3.3 如何實(shí)現(xiàn)文件類型與許可權(quán)限文件類型與許可權(quán)限4位用作文件類型,最多可以標(biāo)識(shí)16種類型接下來(lái)3位是文件特

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

10、位置為0 位與操作位與操作l使用八進(jìn)制數(shù)將二進(jìn)制數(shù)每三位分為一組來(lái)操作,這就是八進(jìn)制數(shù)(0至7)。如可以把二進(jìn)制的1000000110110100分為1,000,000,110,110,100 從而得到八進(jìn)制的10064,這樣更容易理解。(3)使用掩碼來(lái)解碼得到文件類型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 通過(guò)getpwuid來(lái)得到完整的用戶列表 getpwuid需要UID作為參數(shù),返回一個(gè)指向struct passwd的指針。l 通過(guò)getgrgid來(lái)訪問(wèn)組列表l UID沒(méi)有對(duì)應(yīng)的用戶名l /etc/group是組的列表l 用戶可以同時(shí)屬于多個(gè)組l 通過(guò)getgrgid來(lái)訪問(wèn)組列表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對(duì)比lLs2中,模式字段、用戶名和組名的處理已經(jīng)完成,但是標(biāo)準(zhǔn)的ls會(huì)顯示記錄總數(shù),l

13、s2不會(huì),而且ls2還沒(méi)將結(jié)果按文件名排序,也不支持選項(xiàng)-a,它還假設(shè)參數(shù)是目錄名。lLs2還有一個(gè)致命的問(wèn)題,不能顯示指定目錄的信息,例如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)容會(huì)發(fā)生變化,但普通用戶沒(méi)有修改文件的權(quán)限,只有root用戶可以修改, passwd命令怎么修改這個(gè)文件? 3.4 3.4 三個(gè)特殊的位三個(gè)特殊的位Answer :給passwd命令一個(gè)特殊的權(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 檢驗(yàn)SUID位的掩碼#define S_ISUID 0004000幾個(gè)問(wèn)題:幾個(gè)問(wèn)題:2、set-group-ID位:用來(lái)設(shè)置程序運(yùn)行時(shí)所 屬組??梢越o程序某一個(gè)組的訪問(wèn)權(quán)限。 #define S_ISGID 0002000 3、sticky位l對(duì)于文件而言,早期的UNIX系統(tǒng)經(jīng)常要在有限的內(nèi)存中同時(shí)

15、運(yùn)行很多程序,它使用到交換(swap)技術(shù)?,F(xiàn)在,取而代之的是虛擬內(nèi)存技術(shù)。l從交換空間裝載程序要比從普通的硬盤空間快,交換空間上的文件是不分快的。l對(duì)于目錄而言,sticky位使得目錄里的文件只能被創(chuàng)建者刪除。l文件與目錄l用戶與組l文件屬性l文件的所有關(guān)系l許可權(quán)限3.5 3.5 ls小結(jié)小結(jié)l文件類型 (1)文件類型的建立:在創(chuàng)建文件的時(shí)候建立 (2)修改文件類型:文件一經(jīng)創(chuàng)建,類型就無(wú)法修改l許可位與特殊屬性位:在文件創(chuàng)建時(shí)建立,創(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 遇到錯(cuò)誤 0 成功返回(3)用來(lái)修改文件的許可權(quán)限和特殊屬性的命令l 文件的鏈接數(shù)鏈接數(shù)就是文件被引用的次數(shù)。下一章詳細(xì)討論。l 文件所有者與組 (1)修改文件所有者與組: chown (“filel” , 200 , 40 ); /*將文件filel的用戶ID改為200,組ID改為40*/ (2)用來(lái)修改文件所有者和組的命令: shell命令chown和chgrp可以用來(lái)修飾文件

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論