struct stat結構體簡介

轉載:http://www.cnblogs.com/CSU-PL/archive/2013/06/06/3120757.html

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

<sys/types.h>

<sys/stat.h>

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 {

??????? mode_t???? st_mode;?????? //文件對應的模式,文件,目錄等

??????? ino_t????? st_ino;?????? //inode節點號

??????? dev_t????? st_dev;??????? //設備號碼

??????? dev_t????? st_rdev;?????? //特殊設備號碼

??????? nlink_t??? st_nlink;????? //文件的連接數

??????? uid_t????? st_uid;??????? //文件所有者

??????? gid_t????? st_gid;??????? //文件所有者對應的組

??????? off_t????? st_size;?????? //普通文件,對應的文件字節數

??????? time_t???? st_atime;????? //文件最后被訪問的時間

??????? time_t???? st_mtime;????? //文件內容最后被修改的時間

??????? time_t???? st_ctime;????? //文件狀態改變時間

??????? blksize_t st_blksize;??? //文件內容對應的塊大小

??????? blkcnt_t?? st_blocks;???? //偉建內容對應的塊數量

????? };

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
若一目錄具有sticky位(S_ISVTX),則表示在此目錄下的文件只能被該文件所有者、此目錄所有者或root來刪除或改名,在linux中,最典型的就是這個/tmp目錄啦。

分類:?C/C++

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384306.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在Ubuntu上安裝GCC編譯器

如何在Ubuntu上安裝GCC編譯器1.首先更新包列表sudo apt update2.安裝build-essential軟件包&#xff1a; sudo apt install build-essential3.驗證GCC編譯器是否已成功安裝&#xff0c;請使用gcc --version命令打印GCC版本 rootubuntu:/home/csd# gcc --version

操作系統(五)輸入/輸出(I/O)管理

操作系統&#xff08;五&#xff09;輸入/輸出&#xff08;I/O&#xff09;管理一、I/O控制器二、I/O控制方式程序直接控制方式中斷驅動方式DMA方式通道控制方式I/O軟件層次結構假脫機技術設備的分配與回收緩沖區單緩沖雙緩沖循環緩沖區緩沖池一、I/O控制器 I/O設備由機械部件…

Linux下的I/O多路復用select,poll,epoll淺析

轉載&#xff1a;http://blog.csdn.net/u011573853/article/details/52105365 一&#xff0c;什么是I/O多路復用 所謂的I/O多路復用在英文中其實叫 I/O multiplexing. 就是單個線程&#xff0c;通過記錄跟蹤每個I/O流(sock)的狀態&#xff0c;來同時管理多個I/O流 。) I/O mu…

計算機組成原理(一)計算機系統概述

計算機組成原理&#xff08;一&#xff09;計算機系統概述一、計算機系統層次結構馮諾伊曼機計算機工作過程多級層次結構一、計算機系統層次結構 馮諾伊曼機 特點&#xff1a; 計算機由五大部件組成指令和數據以同等地位存于存儲 器&#xff0c;可按地址尋訪指令和數據用二進…

計算機組成原理(二)數據的表示和運算

計算機組成原理&#xff08;二&#xff09;數據的表示和運算一、BCD碼二、奇偶校驗碼三、海明碼四、循環冗余校驗碼&#xff08;CRC&#xff09;五、乘法運算原碼乘法補碼乘法六、除法運算原碼除法補碼除法七、浮點數的表示與運算浮點數的運算一、BCD碼 組合式BCD碼&#xff1…

select read write

轉載&#xff1a;http://blog.csdn.net/beginning1126/article/details/8057498 [cpp] view plaincopy <p style"color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style"font-size:14px;…

數據結構(七)圖的遍歷(遞歸非遞歸方法)

圖的遍歷&#xff08;遞歸非遞歸方法&#xff09;#include<iostream> #include<stdio.h> #include<stack> #include<queue> using namespace std;typedef char VertexType; typedef int EdgeType;#define MAXVEX 100 #define INF 65535 bool visited[M…

Linux IO復用區別與epoll詳解

轉載&#xff1a;http://blog.csdn.net/hacker00011000/article/details/52160590 一、select、poll、epoll之間的區別總結[整理]   select&#xff0c;poll&#xff0c;epoll都是IO多路復用的機制。I/O多路復用就通過一種機制&#xff0c;可以監視多個描述符&#xff0c;一…

簡單圖和多重圖

一、簡單圖 ?? ① 不存在重復邊&#xff1b; ?? ② 不存在頂點到自身的邊&#xff1b; 二、多重圖 ??① 某兩結點之間邊數多于一條&#xff1b; ??② 允許頂點通過一條邊和自己關聯&#xff1b;

C++筆記:select多路復用機制

轉載&#xff1a;http://blog.csdn.net/qdx411324962/article/details/42499535 函數作用&#xff1a; 系統提供select函數來實現多路復用輸入/輸出模型。select系統調用是用來讓我們的程序監視多個文件句柄的狀態變化的。程序會停在select這里等待&#xff0c;直到被監視的文件…

交叉編譯執行應用程序出現:No such file or directory

問題分析 當我在arm板子上執行交叉編譯過的程序的時候發現了這個錯誤。通過百度查詢基本都是缺少32位庫什么的,但是都不能解決問題。 然后我用ll指令&#xff0c;也排除了權限的原因。 我們用ldd指令發現&#xff0c;它不是動態執行的&#xff0c;雖然我們可以使用-static指…

select、poll、epoll 比較

轉載&#xff1a;http://blog.csdn.net/dodo_328/article/details/39081183 1.Selet&#xff1a;本質上是通過設置或者檢查存放fd標志位的數據結構來進行下一步處理。 缺點&#xff1a;1 單個進程可監視的fd數量被限制&#xff0c;因為受描述符集合fd_set限制&#xff0c;fd數量…

C庫函數 File

C庫函數常用的有&#xff1a;fopen, fclose, fread, fwrite, fgets, fputs, fscanf, fprintf, fseek, fgetc, fputc, ftell, feof, flush等&#xff0c; 當使用fopen打開一個文件時通常返回一個文件指針 FILE *fp。FILE類型是一個結構體&#xff0c;包含文件描述符&#xff08;…

Unix 網絡編程(四)- 典型TCP客服服務器程序開發實例及基本套接字API介紹

轉載&#xff1a;http://blog.csdn.net/michael_kong_nju/article/details/43457393 寫在開頭&#xff1a; 在上一節中我們學習了一些基礎的用來支持網絡編程的API&#xff0c;包括“套接字的地址結構”、“字節排序函數”等。這些API幾乎是所有的網絡編程中都會使用的一些&…

C庫函數與系統函數的關系

轉載于:https://www.cnblogs.com/lr1402585172/p/10464933.html

Unix網絡編程(六)高級I/O技術之復用技術 select

轉載&#xff1a;http://blog.csdn.net/michael_kong_nju/article/details/44887411 I/O復用技術 本文將討論網絡編程中的高級I/O復用技術&#xff0c;將從下面幾個方面進行展開&#xff1a; a. 什么是復用技術呢&#xff1f; b. 什么情況下需要使用復用技術呢&#xff1f; c. …

open、read、write、文件類型

open&#xff0c;打開一個文件、創建一個文件或判斷一個文件是否存在。 頭文件&#xff1a;<sys/types.h> <sys/stat.h> <fcntl.h> 重載函數有&#xff1a;int open(const char *pathname, int flags) int open(const char *pathname, int flags, mode_t m…

用模板寫單鏈表 尹成

轉載&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39081953 為了加深對模板的理解&#xff0c;我們今天一起用模板寫一個單鏈表&#xff0c;希望通過這個例子&#xff0c;能夠幫助大家加深對模板的體會&#xff0c;具體如下&#xff1a; SList.hpp內容&#xf…

lseek、stat、access、chmod、strtol、truncate、unlink

lseek&#xff0c;可實現計算文件長度&#xff0c;以及文件擴展。 int ret lseek(fd, 0, SEEK_END); //文件長度printf("file lendth %d\n", ret); int ret lseek(fd, 2000, SEEK_END); //文件拓展2000個byte 在文件末尾偏移2000printf("return va…

inode淺談

索引節點inode&#xff1a;保存的其實是實際的數據的一些信息&#xff0c;這些信息稱為“元數據”(也就是對文件屬性的描述)。例如&#xff1a;文件大小&#xff0c;設備標識符&#xff0c;用戶標識符&#xff0c;用戶組標識符&#xff0c;文件模式&#xff0c;擴展屬性&#x…