第四章 檔案和目錄
本章將描述檔案系統特徵和檔案性質
1、stat、fstat和lstat函式
原型:#include
int stat(const char* restrict pathname, struct stat *restrict buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char* restrict pathname, struct stat *restrict buf); 若成功返回0,出錯返回-1
注:lstat與stat的不同,當命名檔案是乙個符號鏈結時,lstat返回符號鏈結的有關資訊,而stat返回引用檔案的資訊。
struct stat;
stat函式使用ls -l
2、檔案型別:包括普通檔案、目錄檔案、塊特殊檔案、字元特殊檔案、fifo、套接字、符號鏈結。
檔案型別資訊包括在stat結構的st_mode欄位
,可用以下巨集檢測檔案型別:
s_isreg():普通檔案;s_isdir():目錄檔案;s_ischr():字元特殊檔案;s_isblk():塊特殊檔案;s_isfifo():管道或fifo;s_islnk():符號鏈結;s_issock():套接字。 注:標頭檔案:引數是st_mode
由於posix.1允許實現將程序間通訊物件(如訊息佇列和訊號量等)表示為檔案,所以有一些對應巨集用於測是:s_typeismq():訊息佇列;s_typeissem():訊號量;s_typeisshm():共享儲存物件。注:linux沒有把他們實現為檔案,所以沒啥用。
3、設定使用者id和組id
與程序相關的id:實際使用者id、實際組id(我們實際上是誰,這兩個值取自登陸時)、
有效使用者id、有效組id、附加組id(用於檔案訪問許可權檢查,決定了訪問許可權)、
儲存的設定使用者id、儲存的設定組id(由exec函式儲存),
通常:有效使用者id等於實際使用者id,有效組id等於實際組id。
每個檔案都有所有者(st_uid)和組所有者(st_gid)。
可以在st_mode中設定乙個特殊標誌,使「當執行這個檔案時,將程序的有效使用者id設定為所有者id」,這叫做設定使用者id,
同理有設定組id。例如:passwd程式就使用了設定使用者id。。。可用s_isuid和s_isgid巨集測試設定使用者id和設定組id。
4、檔案訪問許可權
9個訪問許可權位:
s_irusr:使用者讀;s_iwuer:使用者寫;s_ixusr:使用者執行;
s_irgrp:組讀;s_iwgrp:組寫;s_ixgrp:組執行;
s_iroth:其他讀 s_iwoth:其他寫 s_ixoth:其他執行。
5、新檔案和目錄的所有權:新檔案的使用者id設定為程序的有效使用者id,組id設定為:(1)程序的有效組id;(2)所在目錄的組id。
6、access函式:按實際使用者id和實際組id進行訪問許可權測試。用於驗證實際使用者能否訪問1個檔案。
原型:#includeint access(const char* pathname, int mode); mode:r_ok(測試讀許可權),w_ok(測試寫許可權),x_ok(測試執行許可權),f_ok(測試檔案是否存在) 注:這些標誌可以進行或運算,來自標頭檔案
7、umask函式:為程序設定檔案模式建立遮蔽字,並返回以前的值,無出錯函式。
原型:#includemode_t umask(mode_t cmask) 返回以前的檔案模式建立遮蔽字,其中引數cmask是s_irusr等9個常量之一或按位或的結果。
說明:任何在檔案模式建立遮蔽字中為1的位,在檔案mode中的對應位一定被關閉。
8、chmod和fchmod函式:更改現有檔案的訪問許可權
原型:#include
int chmod(const char* pathname, mode_t mode);
int fchmod(int filedes, mode_t mode); 成功返回0,失敗返回-1
mode可以使用的引數:1、上文的9個檔案訪問常量 2、s_irwxu、s_irwxg、s_irwxo、s_isuid(設定使用者id)、s_isgid(設定組id)、s_isvtx(儲存正位(粘住位))
9、粘住位:如果對乙個目錄設定了粘住位,則要更名和或刪除該目錄下的檔案必須滿足以下條件之一:擁有此檔案;擁有此目錄;是超級使用者。 一般來說,/temp目錄就設定了粘住位。
10、chown、fchown和lchown函式:可用於更改檔案的使用者id或組id
原型:#include
int chown(const char* pathname, uid_t owner, gid_t group);
int fchown(int filedes, uid_t owner, gid_t group);
int lchown(const char* pathname, uid_t owner, gid_t group); 成功返回0,失敗返回-1 lchown:當是符號鏈結時,lchown改變符號鏈結本身的所有者,而不是該符號鏈結指向的檔案。
若owner或 group引數的值為-1,則對應的值不變。
11、檔案長度:stat結構成員st_size表示以位元組為單位的檔案長度。此字段只對普通檔案、目錄檔案和符號鏈結有意義。 stat的st_blksize欄位:檔案io較合適的塊長度 st_blocks:實際512位元組數量。
du -s core : 報告該檔案的st_blocks值 wc -c core:用於統計檔案中的位元組數 (這一段講述了關於檔案空洞問題)
12、檔案截短:
原型:#includeint truncate(const char* pathname, off_t length);
int ftruncate(int filedes, off_t length); 成功返回0,失敗返回-1
將現有的檔案長度截短為length長度,若length長於原來長度,則會產生空洞。
13、檔案系統:i節點記錄了檔案的大部分資訊:鏈結計數(stat的st_nlink成員)、檔案型別、檔案訪問許可權等等。只有兩項資訊放在目錄項中:檔名和i節點編號。
兩個目錄想指向同乙個i節點叫做硬鏈結(nlink_t)、符號鏈結(s_iflnk)
18、utime函式:更改乙個檔案的訪問和修改時間。
原型:#includeint utime(const char* pathname, const struct utimbuf *times);
struct utimbuf times是null則設定當前時間。
19、mkdir和rmdir函式:建立目錄和刪除目錄
原型:#includeint mkdir(const char* pathname, mode_t mode);
#includeint rmdir(const char* pathname); 用於刪除乙個空目錄。
20、讀目錄:
#include
dir *opendir(const char* pathname); 返回值:若成功返回指標,若出錯返回null
struct dirent *readdir(dir* dp); 返回值:若成功返回指標,若出錯返回null
void rewinddir(dir* dp);
int closedir(dir* dp); 返回值:若成功返回0,若出錯返回-1
long telldir(dir *dp); 返回值:與dp關聯的目錄中的當前位置
void seekdir(dir* dp, long loc);
struct dirent
注意:程式清單4-7用到了函式path_alloc(),但是程式中沒定義,編譯無法通過。我的解決方法是自己定義乙個path_alloc(),簡單方便。
char*path_alloc(int* size)
程式清單4-7用到了opendir,readdir,closedir。
21、chdir、fchdir和getcwd函式
程序通過呼叫chdir和fchdir函式可以更改當前工作目錄:#includeint chdir(const char* pathname); int fchdir(int filedes); 這兩個函式分別用pathname或開啟的檔案描述符來指定新的當前工作目錄。 注意:當前工作目錄是程序的乙個屬性,所以chdir函式不會影響別的程序。
#includechar* getcwd(char* buf, size_t size); 得到完整路徑名。
22、裝置特殊檔案:(1)、系統中與每個檔名關聯的st_dev值是檔案系統的裝置號,只有字元特殊檔案和塊特殊檔案才有st_rdev值。
綠色通道:
好文要頂
關注我收藏該文
與我聯絡
Unix環境高階程式設計 2版
1.簡單實現 ls include opendir readdir closedir 2.將標準輸入複製到標準輸出 include n read stdin fileno,buf,4096 write stdout fileno,buf,n 3.執行時限制 include long sysconf ...
unix環境高階程式設計 訊號(2)
函式kill和raise kill函式將訊號傳送給程序或程序組,raise函式則執行程序向自身傳送訊號。kill的pid引數有以下四種不同情況 pid 0,將該訊號傳送給程序id為pid的程序 pid 0,將該訊號傳送給與傳送程序屬於同一程序組的所有程序。pid 0 將該訊號傳送給程序組id等於pi...
UNIX環境高階程式設計學習筆記
include include include include int main int argc,char argv err sys can t open s argv 1 while dirp readdir dp null printf s n dirp d name closedir dp ...