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); |
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 |
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 |
因為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); |
有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 |
對於目錄通常至少要設定一個執行許可權位,以允許訪問該目錄中的檔名。
4.14.2 刪除空目錄
#include <unistd.h> int rmdir(const char *pathname); 返回值:成功返回0,失敗返回-1 |
如果連結計數達到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 |
其他執行 |
許可其他執行檔案 |
許可其他在目錄中搜索給定路徑名 |