1. 程式人生 > >Unix/Linux程式設計-檔案和目錄(二)

Unix/Linux程式設計-檔案和目錄(二)

檔案和目錄(二)

4.8 更改檔案實際使用者ID和實際組ID

#include <unistd.h>

int  chown(const char *pathname, uid_t owner, gid_t group);

int  fchown(int fd, uid_t owner, gid_t group);

int  fchownat(int fd, const char *pathname, uid_t owner, gid_t group, int flag);

int lchown(const *pathname, uid_t owner, gid_t group);

返回值:成功返回0,出錯返回-1


(1) owner或group中的任意一個是-1,則對應的ID不變。
(2) 在富豪連結情況下,lchown和fchownat(設定了AT_SYMLINK_NOFOLLOW標誌)更改符號連結本身的所有者,而不是該符號連結所指向的檔案的所有者。
(3) 基於BSD的系統一直規定只有超級使用者才能更改一個檔案的所有者。System V則允許仁義使用者更改他們所擁有的檔案的所有者。

4.9 檔案截斷

#include <unistd.h>

int  truncate(const char *pathname, off_t length);

int  ftruncate(int fd, off_t length);

這兩個函式將一個現有檔案長度截斷為length。如果該檔案以前的長度大於length,則超過length意外的資料不能再訪問。如果以前的長度小於length,檔案長度增加,在以前的檔案尾端和新的檔案尾端之間的資料讀作0。

4.10 建立一個現有檔案的連結

任何一個檔案可以有多個目錄項指向其i節點。建立一個指向現有檔案的連結的方法是使用link函式或linkat函式。

#include <unistd.h>

int link(const char *existingpath,const char *newpath;

int linkat(int efd,const char *existingpath, int nfd, const char *newpath, int flag);

返回值:成功返回0,出錯返回-1


如果newpath已經存在,則返回出錯。只建立newpath的最後一個分量,路徑中的其他部分應當已經存在。
當現有檔案是符號連結時,有flag引數來控制linkat函式是建立指向現有符號連結的連結還是建立指向現有符號連結所指向的檔案的連結。flag引數設定了AT_SYMLINK_NOFOLLOW標誌,就建立指向符號連結目標的連結。

4.11 刪除現有的目錄項

#include <unistd.h>

int unlink(const char *pathname);

int unlinkat(int fd, const char *pathname, int flag);

返回值:成功返回0,出錯返回-1

刪除目錄項,並將由pathname所引用檔案的連結計數減1.
flag引數給出了一種方法,使呼叫程序可以改變unlinkat函式的額預設行為,當AT_REMOVEDIR標誌被設定時,unlinkat函式可以類似於rmdir一樣刪除目錄。

4.12 建立和讀取符號連結

符號連結是對一個檔案的簡介指標,而硬連結直接指向檔案的i節點,引入符號連結是為了避開硬連結的一些限制。硬連結通常要求連結和檔案位於同一檔案系統中;只有超級使用者才能建立指向目錄的硬連結。

#include <unistd.h>

int symlink(const char *actualpath, const char *sympathy);

int symlinkat(const char *actualpath, const char *sympathy);

返回值:成功返回0,錯誤返回-1

函式建立了一個指向actualpath的新目錄項sympath。在建立此符號連結是,並不要求actualpath已經存在。


因為open函式跟隨符號連結,所以需要有一種方法開啟該連結本身,並讀該連線中的名字。

#include <unistd.h>

ssize_t readlink(const char *pathname, char *buf, size_t bufsize);

ssize_t readlinkat(int fd, const char *pathname, char *buf, size_t bufsize);

返回值:成功返回讀取的位元組數,出錯返回-1

4.13 讀目錄函式

#include <dirent.h>

DIR *opendir(const char *pathname);

DIR *fdopendir(int fd);

返回值:成功返回目錄指標,出錯返回NULL

 

struct  dirent *readdir(DIR *dp);

返回值:成功返回dirent結構指標,若在目錄尾或出錯,返回NULL

 

void  rewinddir(DIR *dp);

int closedir(DIR *dp);

返回值:成功返回0,出錯返回-1

 

long  telldir(DIR *dp);

返回值:與dp關聯的目錄中的當前位置

 

void seekdir(DIR *dp,long loc);

DIR結構是一個內部結構,上述函式用這個內部結構儲存當前正在被讀的目錄的有關資訊。
有opendir和fdopendir返回的指向DIR。opendir執行初始化操作,使第一個readdir返回目錄中的第一個目錄項。DIR結構有fdopendir建立時,readdir返回的第一項取決於傳給fdopendir函式的檔案描述符相關的檔案偏移量。

4.14 mkdir、mkdirat、rmdir函式

4.14.1 建立空目錄

#include <sys/stat.h>

int mkdir(const char *pathname, mode_t mode);

int mkdirat(int fd, const char *pathname, mode_t mode);

返回值:成功返回0,出錯返回-1

建立一個新的空目錄,其中. 和 .. 目錄項是自動建立的。所指定的檔案訪問許可權mode還會經過程序的檔案模式建立遮蔽字修改(umask)。
對於目錄通常至少要設定一個執行許可權位,以允許訪問該目錄中的檔名。

4.14.2 刪除空目錄

#include <unistd.h>

int rmdir(const char *pathname);

返回值:成功返回0,失敗返回-1

如果呼叫此函式使得目錄的連結計數為0,並且也沒有其他程序開啟此目錄,則釋放此目錄。
如果連結計數達到0時,有一個 或多個程序開啟此目錄,則在此函式返回前刪除最後一個連結. 和 ..項。而且在此目錄中不能再建立新檔案,但是在最後一個程序關閉它之前並不釋放此目錄。

4.15 檔案許可權位總結

mode常量

說明

對普通檔案的影響

對目錄檔案的影響

S_ISUID

設定使用者ID

執行時設定有效使用者ID

 

S_ISGID

設定組ID

若組執行位設定,則執行時設定有效組ID;否則使強制性起作用

將目錄中建立的新檔案的組ID設定為目錄的組ID

S_ISVTX

粘著位

在交換區緩衝程式正文

限制在目錄中刪除和重新命名檔案

S_IRWXU

使用者讀寫執行

許可使用者讀寫執行檔案

許可使用者讀目錄項,刪除和建立目錄,搜尋給定路徑名

S_IRUSR

使用者讀

許可使用者讀檔案

許可使用者讀目錄項

S_IWUSR

使用者寫

許可使用者寫檔案

許可使用者在目錄中刪除和建立檔案

S_IXUSR

使用者執行

許可使用者執行檔案

許可使用者在目錄中搜索給定路徑名

S_IRWXG

組讀寫執行

許可組讀寫執行檔案

許可組讀目錄項,刪除和建立目錄,搜尋給定路徑名

S_IRGRP

組讀

許可組讀檔案

許可組讀目錄項

S_IWGRP

組寫

許可組寫檔案

許可組在目錄中刪除和建立檔案

S_IXGRP

組執行

許可組執行檔案

許可組在目錄中搜索給定路徑名

S_IRWXO

其他讀寫執行

許可其讀寫執行檔案

許可其他讀目錄項,刪除和建立目錄,搜尋給定路徑名

S_IROTH

其他讀

許可其他讀檔案

許可其他讀目錄項

S_IWOTH

其他鞋

許可其他寫檔案

許可其他在目錄了中刪除和建立檔案

S_IXOTH

其他執行

許可其他執行檔案

許可其他在目錄中搜索給定路徑名