int lstat(const char *path,struct stat*buf)
當文件是一個符號鏈接時,lstat返回的是該符號鏈接本身的信息,而stat返回的是該鏈接指向的文件的信息。
struct stat {dev_t st_dev; //設備號碼ino_t st_ino; //inode節點號mode_t st_mode; //文件對應的模式,文件,目錄,sock,管道等等nlink_t st_nlink; //文件的連接數 軟連接或硬鏈接uid_t st_uid; //文件所有者gid_t st_gid; //文件所有者對應的組dev_t st_rdev; //特殊設備號碼off_t st_size; //普通文件,對應的文件字節數timestruc_t st_atim; //文件最后被訪問的時間timestruc_t st_mtim; //文件內容最后被修改的時間timestruc_t st_ctim; //文件狀態改變時間blksize_t st_blksize; //文件內容對應的塊blkcnt_t st_blocks; //文件內容對應的塊數量char st_fstype[_ST_FSTYPSZ]; };
stat結構體中的st_mode則定義了下列數種情況
?????? ??????
S_IFMT?? | 0170000 | 文件類型的位遮罩 |
S_IFSOCK | 0140000 | socket |
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_WGRP | 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(st_mode) | 是否為先進先出 |
S_ISSOCK(st_mode) | 是否為socker |
若一般目錄具有sticky位(S_ISVTX),則表示在此目錄下的文件只能被該文件所有者、此目錄所有者或root來輸出或改名,在linux中,最典型的就是/tmp目錄了。
?