1. 程式人生 > >Linux中文件函數(一)

Linux中文件函數(一)

linux res restrict 執行 符號 stata 統計 必須 AS

一、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,int
flag);

給出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中文件函數(一)