第四章 文件和目錄
1、函數stat、fstat、fstatat和lstat
#include<sys/stat.h>
Intstat(const char *restrict pathname,struct stat *restrict buf);
Intfstat(int fd,struct stat *buf);
Intlstat(const char *restrict pathname,struct stat *restrict buf);
Intfstatat(int fd,const char *restrict pathname,struct stat *restrict buf,intflag);
返回值:若成功,返回0;若出錯,返回-1。
stat函數能根據pathname得到以此name命名的文件的信息結構。
lstat能夠根據pathname得到以此name命名的連接文件的信息結構。lstat列出的是符號連接文件本身,而不是連接引用的文件。用途:需要以降序遍歷目錄層次結構時。
fstatat根據文件描述符得到相應文件的信息結構。
fstatat函數操作的函數爲:由fd參數指向的相對於當前打開目錄的路徑名,返回文件統計信息。
struct stat {
dev_t st_dev; //文件的設備編號
ino_t st_ino; //節點
mode_t st_mode; //文件的類型和存取的權限
nlink_t st_nlink; //連到該文件的硬連接數目,剛建立的文件值爲1
uid_t st_uid; //用戶ID
gid_t st_gid; //組ID
dev_t st_rdev; //(設備類型)若此文件爲設備文件,則爲其設備編號
off_t st_size; //文件字節數(文件大小)
unsigned long st_blksize; //塊大小(文件系統的I/O 緩衝區大小)
unsigned long st_blocks; //塊數
time_t st_atime; //最後一次訪問時間
time_t st_mtime; //最後一次修改時間
time_t st_ctime; //最後一次改變時間(指屬性)
};
2、函數access和faccessat
按實際用戶ID和實際組ID進行訪問測試訪問能力。
#include<unistd.h>
Int access(const char *pathname,intmode);
Int faccessat(int fd, const char*pathname,int mode,int flag);
返回值:若成功,返回0,若失敗,返回-1.
兩個函數在下面兩種情況下是相同的:一種是pathname參數爲絕對路徑,另一種是fd參數取值爲AT_FDCWD而pathname參數爲絕對路徑;否則faccessat計算相對於打開目錄的pathname。
3、函數umask
函數umask爲進程設置文件模式創建屏蔽字,並返回之前的值。
#include<sys/stat.h>
mode_tumask(mode_t mode);
返回值:之前的文件模式創建屏蔽字。
在文件模式創建屏蔽字中爲1的位,在文件mode中的相應位一定被關閉。
示例:umask(0001);禁止其他執行;
4、函數chmod、fchmod和fchmodat
這三個函數可以使我們更改現有文件的訪問權限
#include<sys/stat.h>
Int chmod(constchar *pathname,mode_t mode);
Int fchmod(intfd,mode_t mode);
Int fchmodat(intfd,const char *pathname,mode_t mode,int flag);
返回值:若成功,返回0;若出錯,返回-1.
函數chmod在指定的文件上進行操作,fchmod函數則對已打開的文件進行操作;fchmodat與chmod函數類似(絕對/相對路徑名)
宏定義 | 值 | 說明 |
S_ISUID | 04000 | 設置用戶權限 |
S_ISGID | 02000 | 設置組用戶權限 |
S_ISVTX | 01000 | 設置sticky位 |
S_IRUSR | 00400 | 文件所有者的讀權限 |
S_IWUSR | 00200 | 文件所有者的寫權限 |
S_IXUSR | 00100 | 文件所有者的執行權限或目錄搜索權限 |
S_IRGRP | 00040 | 組用戶的讀權限 |
S_IWGRP | 00020 | 組用戶的寫權限 |
S_IXGRP | 00010 | 組用戶的執行權限或目錄搜索權限 |
S_IROTH | 00004 | 其他用戶的讀權限 |
S_IWOTH | 00002 | 其他用戶的寫權限 |
S_IXOTH | 00001 | 其他用戶的執行權限和目錄搜索權限 |
示例:chmod( path, 0700) ;
5、函數chown、fchown、fchownat和lchown
下面幾個函數可用於更改文件的用戶ID和組ID。如果兩個參數owner或group中的任意一個是-1,則對應的ID不變。
#include<unistd.h>
Int chown(const char*pathname,uid_t owner,gid_t group);
Int fchown(int fd,uid_towner,gid_t group);
Int fchownat(int fd,const char*pathname,uid_t owner,gid_t group,int flag);
Int lchown(const char*pathname,uid_t owner,gid_t group);
返回值:若成功,返回0;若出錯,返回-1.
除了所引用的文件是符號鏈接以外,這四個函數的操作類似。在符號鏈接情況下,lchown和fchownat更改符號連接本身的所有者,而不是該符號鏈接所指向的文件的所有者。
6、文件系統
https://blog.csdn.net/men_wen/article/details/52972678
傳統的UNIX系統V文件系統,可以將一個硬盤分爲多個分區,每個分區可以包含一個文件系統
i節點是固定長度的記錄項,包含有關文件的信息。
7、函數link、linkat、unlink、unlinkat和remove
任何一個文件可以有多個目錄項指向其i節點。創建一個指向現有文件的連接的方法是使用link函數或linkat函數。
#include<unistd.h>
Intlink(const char *existingpath,const char *newpath);
Int linkat(intfd,const char *existingpath,int nfd,const char *newpath,int flag);
兩個函數返回值:若成功,返回0;若出錯,返回-1.
這兩個函數創建一個新目錄項,它引用現有文件existingpath。
爲了刪除一個現有的目錄項,可以調用unlink函數。
#include<unistd.h>
Int unlink(constchar *pathname);
Int unlinkat(intfd,const char *pathname,int flag);
兩個函數返回值:若成功,返回0;若出錯,返回-1.
這兩個函數刪除目錄項,並將有pathname所引用文件的鏈接計數減1.只有當鏈接計數達到0時,該文件的內容纔可被刪除。
也可以用remove函數解除對一個文件或目錄的鏈接,對於文件,其功能與unlink相同,對於目錄,其功能與rmdir相同
#include<stdio.h>
Int remove(constchar* pathname);
8、函數rename和renameat
文件或目錄可以用rename或者renameat函數進行重命名。
#include<stdio.h>
Int rename(constchar *oldname,const char *newname);
Int renameat(intoldfd,const char *oldname,int newfd,const char *newname);
兩個函數返回值:若成功,返回0;若失敗,返回-1
9、函數mkdir、mkdirat和rmdir
用mkdir和mkdirat函數創建目錄,用rmdir刪除目錄。
#include<sys/stat.h>
Int mkdir(constchar *pathname,mode_t mode);
Int mkdirat(intfd,const char *pathname,mode_t mode);
兩個函數返回值:若成功,返回0;若出錯,返回-1.
#include<unistd.h>
Int rmdir(constchar *pathname);
返回值:若成功,返回0;若出錯,返回-1.
10、函數chdir、fchdir和getcwd
進程調用chdir或fchdir函數可以更改當前工作目錄。
#include<unistd.h>
Int chdir(constchar *pathname);
Int fchdir(intfd);
兩個函數返回值:若成功,返回0;若出錯,返回-1.
在兩個函數中,分別用pathname或打開文件描述符來指定新的當前工作目錄。
示例:chdir(“/tmp”);
函數getcwd可以得到當前工作目錄完成的絕對路徑名。
#include<unistd.h>
char *getcwd(char*buf,size_t size);
返回值:若成功,返回buf;若出錯,返回NULL。
兩個參數,一個是緩衝區地址buf,另一個是緩衝區長度。