stat 函式族介紹

2021-09-02 20:44:50 字數 3443 閱讀 2734

stat 函式族可以用來獲取檔案的結構元資訊,主要有以下四個函式:

#include

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);

/* 四個函式的返回值:若成功,返回 0;否則,返回 -1 */

其中,stat 函式獲得與 pathname 命名檔案有關的資訊結構;fstat 函式獲得已在描述符 fd 上開啟檔案的有關資訊;lstat 函式類似於 stat,但當命名檔案是乙個符號鏈結時,則獲取的是該符號鏈結的有關資訊,而非引用檔案的資訊。

fstatat 函式為乙個相對於當前開啟目錄(由 fd 引數指向)的路徑名返回檔案統計資訊。flag 引數控制著是否跟隨著乙個符號鏈結。當設定 at_symlink_nofollow 標誌時,fstatat 函式不會跟隨符號鏈結,而是返回符號鏈結本身的資訊。否則,在預設情況下,返回的是符號鏈結所指向的實際檔案的資訊。如果 fd 引數的值是 at_fdcwd,並且 pathname 是乙個相對路徑名,

fstatat 會計算相對於當前目錄的 pathname 引數。如果 pathname 是乙個絕對路徑,fd 引數就會被忽略。這兩種情況下,根據 flag 的取值,fstatat 的作用就跟 stat 或 lstat 一樣。

struct stat;

timespec 結構型別按照秒和納秒定義了時間,至少包括下面兩個字段:

time_t tv_sec;

long tv_nsec;

stat 結構中的 st_mode 包含了檔案型別資訊,檔案型別包括如下幾種:

(1) 普通檔案(regular file)。這是最常用的檔案型別,包含了某種形式的資料。至於是文字還是二進位制資料,unix 核心並不在意,因為對普通檔案內容的解釋是由該檔案的應用程式進行的。不過乙個值得注意的例外是二進位制可執行檔案。為了執行程式,核心必須理解其格式。所有二進位制可執行檔案都遵循一種標準化的格式,以便核心能夠確定程式文字和資料的載入位置。

(2) 目錄檔案(directory file)。這種檔案包含了其他檔案的名字以及指向與這些檔案資訊有關的指標。對乙個目錄具有讀許可權的任意程序都可以讀該目錄的內容,但只有核心可以直接寫目錄檔案,程序必須使用特定的函式才能更改目錄。

(3) 塊特殊檔案(block special file)(注意,freebsd 不再支援塊特殊檔案,對裝置的所有訪問需要通過字元特殊檔案進行)。這種型別的檔案提供對裝置(如磁碟)帶緩衝的訪問,每次訪問以固定長度為單位進行。

(4) 字元特殊檔案(character special file)。這種型別的檔案提供對裝置不帶緩衝的訪問,每次訪問長度可變。系統中的所有裝置要麼是字元特殊檔案,要麼是塊特殊檔案。

(5) fifo。這種型別的檔案用於程序間通訊,有時也稱命名管道(named pipe)。

(6) 套接字(socket)。這種型別的檔案用於程序間的網路通訊,也可以用於一台宿主機上程序間的非網路通訊。

(7) 符號鏈結(symbolic link)。這種型別的檔案指向另乙個檔案。

可以用下面這些巨集來確定檔案型別,這些巨集的引數都是 stat 結構中的 st_mode 成員:

#include

s_isreg() // 普通檔案

s_isdir() // 目錄檔案

s_ischr() // 字元特殊檔案

s_isblk() // 塊特殊檔案

s_isfifo() // 管道或 fifo

s_islnk() // 符號鏈結

s_issock() // 套接字

另外,posix.1 允許實現將程序間通訊(ipc)物件(如訊息佇列和訊號量等)說明為檔案。下面這些巨集可用來從 stat 結構中確定 ipc 物件的型別,它們的引數是指向 stat 結構的指標:

#include

s_typeismq() // 訊息佇列

s_typeissem() // 訊號量

s_typeisshm() // 共享儲存物件

下面是乙個檢視檔案型別的示例:

#include

#include

#include

int main(int argc, char *argv)

if(s_isreg(buf.st_mode))

ptr = "regular";

else if(s_isdir(buf.st_mode))

ptr = "directory";

else if(s_ischr(buf.st_mode))

ptr = "character special";

else if(s_isblk(buf.st_mode))

ptr = "block special";

else if(s_isfifo(buf.st_mode))

ptr = "fifo";

else if(s_islnk(buf.st_mode))

ptr = "symbolic link";

else if(s_issock(buf.st_mode))

ptr = "socket";

else

ptr = "** unknown mode **";

printf("%s\n", ptr);

}exit(0);

}

執行結果:

$ ./printfiletype.out /etc/passwd /etc /dev/log /dev/tty /var/lib/oprofile/opd_pipe /dev/sr0 /dev/cdrom

/etc/passwd: regular

/etc: directory

/dev/log: socket

/dev/tty: character special

/var/lib/oprofile/opd_pipe: lstat error

/dev/sr0: block special

/dev/cdrom: symbolic link

stat函式與stat結構體

在linux中,可以利用stat 函式來獲取乙個檔案的狀態 include include int stat const char file name,struct stat buf 這個函式執行成功返回0,失敗返回 1。取得的檔案狀態存放在buf指標指向的struct stat結構提中,struc...

stat 函式解析

stat 函式是用來獲取檔案的各種屬性的乙個linux下的常用api函式。函式原型為int stat const char path,struct stat buf stat定義如下 struct stat st mode 的定義 16位整數 0 2 其他人許可權 8進製 s iroth 00004...

stat 函式詳解

stat函式作用 獲取檔案資訊 標頭檔案 include include include 函式原型 int stat const char path,struct stat buf 返回值 成功返回0,失敗返回 1 引數 檔案路徑 名 struct stat 型別的結構體struct stat 結構...