LINUX 檔案和目錄 stat結構

2021-07-09 05:48:44 字數 3141 閱讀 1664

在使用這個結構體和方法時,需要引入:

struct stat這個結構體是用來描述乙個linux系統檔案系統中的檔案屬性的結構。

可以有兩種方法來獲取乙個檔案的屬性:

1、通過路徑:

int stat(const char *path, struct stat *struct_stat);

int lstat(const char *path,struct stat *struct_stat);

兩個函式的第乙個引數都是檔案的路徑,第二個引數是struct stat的指標。返回值為0,表示成功執行。

執行失敗是,error被自動設定為下面的值:

ebadf: 檔案描述詞無效

efault: 位址空間不可訪問

eloop: 遍歷路徑時遇到太多的符號連線

enametoolong:檔案路徑名太長

enoent:路徑名的部分元件不存在,或路徑名是空字串

enomem:記憶體不足

enotdir:路徑名的部分元件不是目錄

這兩個方法區別在於stat沒有處理字元鏈結(軟鏈結)的能力,如果乙個檔案是符號鏈結,stat會直接返回它所指向的檔案的屬性;而lstat返回的就是這個符號鏈結的內容。這裡需要說明一下的是軟鏈結和硬鏈結的含義。我們知道目錄在linux中也是乙個檔案,檔案的內容就是這這個目錄下面所有檔案與inode的對應關係。那麼所謂的硬鏈結就是在某乙個目錄下面將乙個檔名與乙個inode關聯起來,其實就是新增一條記錄!而軟鏈結也叫符號鏈結更加簡單了,這個檔案的內容就是乙個字串,這個字串就是它所鏈結的檔案的絕對或者相對位址。

2、通過檔案描述符

int fstat(int fdp, struct stat *struct_stat);  //通過檔案描述符獲取檔案對應的屬性。fdp為檔案描述符

下面是這個結構的結構

struct stat ;

stat結構體中的st_mode 則定義了下列數種情況:

s_ifmt   0170000    檔案型別的位遮罩

s_ifsock 0140000    scoket

s_iflnk 0120000     符號連線

s_ifreg 0100000     一般檔案

s_ifblk 0060000     區塊裝置

s_ifdir 0040000     目錄

s_ifchr 0020000     字元裝置

s_ififo 0010000     先進先出

s_isuid 04000     檔案的(set user-id on execution)位

s_isgid 02000     檔案的(set group-id on execution)位

s_isvtx 01000     檔案的sticky位

s_irusr(s_iread) 00400     檔案所有者具可讀取許可權

s_iwusr(s_iwrite)00200     檔案所有者具可寫入許可權

s_ixusr(s_iexec) 00100     檔案所有者具可執行許可權

s_irgrp 00040             使用者組具可讀取許可權

s_iwgrp 00020             使用者組具可寫入許可權

s_ixgrp 00010             使用者組具可執行許可權

s_iroth 00004             其他使用者具可讀取許可權

s_iwoth 00002             其他使用者具可寫入許可權

s_ixoth 00001             其他使用者具可執行許可權

上述的檔案型別在posix中定義了檢查這些型別的巨集定義:

s_islnk (st_mode)    判斷是否為符號連線

s_isreg (st_mode)    是否為一般檔案

s_isdir (st_mode)    是否為目錄

s_ischr (st_mode)    是否為字元裝置檔案

s_isblk (s3e)        是否為先進先出

s_issock (st_mode)   是否為socket

**:

#include "apue.h"

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

printf("st_uid = %d,st_gid = %d\n",buf.st_uid,buf.st_gid);

} exit(0);

}

輸出結果:

root@ubuntu:/test/linux/20151230# ./a.out /etc/passwd /etc/ /dev/log /dev/tty /dev/cdrom

/etc/passwd: regular

st_uid = 0,st_gid = 0

/etc/: directory

st_uid = 0,st_gid = 0

/dev/log: socket

st_uid = 0,st_gid = 0

/dev/tty: character special

st_uid = 0,st_gid = 5

/dev/cdrom: symbolic link

st_uid = 0,st_gid = 0

檔案 stat 和目錄 opendir

linux stat函式講解 標頭檔案 include 函式定義 int stat const char file name,struct stat buf 函式說明 通過檔名filename獲取檔案資訊,並儲存在buf所指的結構體stat中 返回值 執行成功則返回0,失敗返回 1,錯誤 存於err...

Linux裡stat命令與stat和lstat函式

1.stat命令,可以獲取檔案的詳細資訊 命令列輸入 stat filename 2.stat函式 標頭檔案 include include include 介面 extern int stat const char restrict file,struct stat restrict buf 引數...

Linux的檔案系統,根目錄rootfs結構

檔案系統時作業系統用來管理檔案的。fs filesystem。在linux中,一切皆為檔案,這句話夠經典了吧。linux中每個分割槽都是乙個fs。linux下的filesystem hierarchy standard 檔案系統層次化標準 樹形結構。標準來說,都是基於fhs3.0,裡面詳細解釋了每個...