在使用這個結構體和方法時,需要引入:
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,裡面詳細解釋了每個...