Linux中文件函數(一)
一、stat、fstat、fstatat、lstat函數
函數的原型為:
#include <sys/stat.h> int stat(const char *restrict pathname,struct stat *restrict buf); int fstat(int fd,struct stat *buf); int lstat(const char *restrict pathname,struct stat *restrict buf); int fstatat(int fd,const char *restrict pathname,struct stat *restrict buf,intflag);
給出pathname,stat函數將返回與此命名文件有關的信息結構。fstat函數獲得在描述符fd上打開的有關信息。
lstat返回該符號鏈接的有關信息,而不是由該符號鏈接引用的文件的信息。fstatat函數為一個相對於當前打開
目錄(由fd參數指向)的路徑名返回文件統計信息,flag參數控制著是否跟隨著一個符號鏈接。當AT_SYMLINK_N
OFOLLOW標誌被設置時,fstatat不會跟隨符號鏈接,而是返回符號鏈接本身的信息。否則,在默認情況下,返回
的是符號鏈接所指向的實際文件的信息。如果fd參數的值是AT_FDCWD,並且pathname參數是一個相對路徑名,fs
tatat會計算相對於當前目錄的pathname參數。如果pathname是一個絕對路徑,fd參數就會被忽略。這兩種情況下
,根據flag的取值,fstatat的作用就跟stat或lstat一樣。第2個參數buf是一個指針,它指向一個必須提供的結
構。函數來填充由buf指向的結構。
二、access、faccessat函數
當用open函數打開一個文件時,內核以進程的有效用戶ID和有效組ID為基礎執行其訪問權限測試。有時,進程
也希望按其實際用戶ID和實際組ID來測試其訪問能力。即使一個進程可能已經通過設置用戶ID以超級用戶權限運行
,它仍可能想驗證其實際用戶能否訪問一個給定的文件。access和faccessat函數是按實際用戶ID和實際組ID進行
訪問權限測試的。該函數原型為:
#include <unistd.h> int access(const char *pathname,int mode); int faccessat(int fd,const char *pathname,int mode,int flag);
其中,如果測試文件是否已經存在,mode就為F_OK;否則mode是這些常量的按位或:R_OK,測試讀權限;W_OK,測
試寫權限;X_OK,測試執行權限。faccessat函數與access函數在下面兩種情況下是相同的:一種是pathname參數為
絕對路徑,另一種是fd參數取值為AT_FDCWD而pathname參數為相對路徑。否則,faccessat計算相對於打開目錄(由
fd參數指向)的pathname。flag參數可以用於改變faccessat的行為,如果flag設置為AT_EACCESS,訪問檢查用的是
調用進程的有效用戶ID和有效組ID,而不是實際用戶ID和實際組ID。
三、umask函數
umask函數為進程設置文件模式創建屏蔽字,並返回之前的值。該函數的原型為:
#include <sys/stat.h>
mode_t umask(mode_t cmask);
其中,參數cmask是由這些9個常量中的若幹個按位或構成的。S_IRUSR:用戶讀;S_IWUSR:用戶寫;S_IXUSR:
用戶執行;S_IRGRP:組讀;S_IWGRP:組寫;S_IXGRP:組執行;S_IROTH:其它讀;S_IWOTH:其它寫;S_IXOTH:
其它執行。在進程創建一個新文件或新目錄時,就一定會使用文件模式創建屏蔽字。在文件模式創建屏蔽字中為1
的位,在文件mode中的相應位一定被關閉。
四、chmod、fchmod、fchmodat函數
chmod、fchmod和fchmodat這3個函數使我們可以更改現有文件的訪問權限。函數的原型為:
#include <sys/stat.h> int chmod(const char *pathname,mode_t mode); int fchmod(int fd,mode_t mode); int fchmodat(int fd,const char *pathname,mode_t mode,int flag);
chmod函數在指定的文件上進行操作,而fchmod函數則對已打開的文件進行操作。fchmodat函數與chmod函數在
下面兩種情況下是相同的:一種是pathname參數為絕對路徑,另一種是fd參數取值為AT_FDCWD而pathname參數為相
對路徑。否則,fchmodat計算相對於目錄(由fd參數指向)的pathname。flag參數可以用於改變fchmodat的行為,
當設置了AT_SYMLINK_NOFOLLOW標誌時,fchmodat並不會跟隨符號鏈接。為了改變一個文件的權限位,進程的有效用
戶ID必須等於文件的所有者ID,或者該進程必須具有超級用戶權限。
五、chown、fchown、fchownat、lchown函數
下面的幾個chown函數可用於更改文件的用戶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_t owner,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);
除了所引用的文件是符號鏈接外,這4個函數的操作類似。在符號鏈接情況下,lchown和fchownat(設置了AT_SYM
LINK_NOFOLLOW標誌)更改符號鏈接本身的所有者,而不是該符號鏈接所指向的文件的所有者。fchown函數改變fd參數
指向的打開文件的所有者,既然它在一個已打開的文件上操作,就不能用於改變符號鏈接的所有者。
fchownat函數與chown或者lchown函數在下面兩種情況下是相同的:一種是pathname參數為絕對路徑,另一種是fd參
數取值為AT_FDCWD而pathname參數為相對路徑。在這兩種情況下,如果flag參數中設置了AT_SYMLINK_NOFOLLOW標誌,
fchownat與lchown行為相同,如果flag參數中清除了AT_SYMLINK_NOFOLLOW標誌,則fchownat與chown行為相同。如果
fd參數設置為打開目錄的文件描述符,並且pathname參數是一個相對路徑名,fchownat函數計算相對於打開目錄的pa
thname。
Linux中文件函數(一)