EDA365电子论坛网

标题: linux - 讲解stat函数 [打印本页]

作者: mytomorrow    时间: 2019-10-9 10:25
标题: linux - 讲解stat函数
表头文件:    #include <sys/stat.h>
' @3 \2 @7 a+ G. j
: Z0 E4 C. R) w* _1 ?            #include <unistd.h>

3 K* k  w  m  A+ B+ z7 a; t定义函数:    int stat(const char *file_name, struct stat *buf);
( P* n* L1 N1 a0 o$ L5 C3 V

4 \4 f7 i% l; i6 v1 S9 M  m% f函数说明:    通过文件名filename获取文件信息,并保存在buf所指的结构体stat中

! P, X  K- z# Z4 ?1 H, _
0 i& E/ ]; d; [0 b& i3 e. ^返回值:     执行成功则返回0,失败返回-1,错误代码存于errno
2 \# n, n9 I2 T7 B8 W* J4 u* w5 J
3 E9 i4 U! ?& y2 J2 o% p0 O5 U1 C9 N6 B  ]/ c% G# s
错误代码:: T' H. `/ Z$ b! t2 H+ f/ d
    ENOENT         参数file_name指定的文件不存在
- g; b% X2 F5 Z; C* m" g2 F' V! y! K    ENOTDIR        路径中的目录存在但却非真正的目录
# X2 @8 |% g2 M7 y4 S    ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接
7 Z. R/ v. r/ V5 C3 A8 r( |& c2 Y/ K    EFAULT         参数buf为无效指针,指向无法存在的内存空间1 p+ P- `7 A2 b9 H
    EACCESS        存取文件时被拒绝) u( j8 A5 L5 ?# k2 G8 J
    ENOMEM         核心内存不足
8 ?, z5 \$ E# g8 M    ENAMETOOLONG   参数file_name的路径名称太长
' g$ L7 J9 K/ l' _) C, ?2 A- }
- s- I* ~8 K( L
#include <sys/stat.h>/ e' B: n' ]7 _. j* o: i
#include <unistd.h>
1 r9 B$ y  S( r* F) H3 @, b1 ?1 k! \5 K% M#include <stdio.h>/ R9 r0 t: }, o  ]
' O9 S( p" D4 f" G& ?
int main() {1 W! K. a8 }0 h
    struct stat buf;
% V- u4 Z/ ^4 R* ?' k$ r2 c    stat("/etc/hosts", &buf);3 V- C9 g7 O- J3 ~0 y4 R2 M
    printf("/etc/hosts file size = %d/n", buf.st_size);
0 i" P+ J( I1 Q( v/ w2 x}
  S9 c2 i4 c' Y. z, X8 J2 }
7 V' l! F- V% r3 R3 h; a# P
& s1 I) E1 s, b3 f3 K-----------------------------------------------------
: {& y" [/ n: jstruct stat {
7 a7 U% w" p0 I2 r# p  }; k2 {    dev_t         st_dev;       //文件的设备编号. j) F: U3 b" M0 L2 }
    ino_t         st_ino;       //节点
) b6 a0 T' j% e1 m* |% O    mode_t        st_mode;      //文件的类型和存取的权限
4 h4 a, p# A6 @: z8 N    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
3 k% V+ a- R( t3 @/ r    uid_t         st_uid;       //用户ID6 C0 _$ D) m3 x6 |0 p# U
    gid_t         st_gid;       //组ID
3 G, r- E* W. ?# _# G% e    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
: c- _, m  L* S3 X5 L    off_t         st_size;      //文件字节数(文件大小)
! |' A, j- D4 Y1 g$ r) e    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
5 L# A( v4 @$ [7 i/ |7 n: H. i    unsigned long st_blocks;    //块数
  l5 b. [! ~* p9 Z. L) ^    time_t        st_atime;     //最后一次访问时间
$ Y/ a/ h1 U& H' q' ?- a    time_t        st_mtime;     //最后一次修改时间8 U/ C" a: F7 I; x& C( f# L
    time_t        st_ctime;     //最后一次改变时间(指属性)  g! _4 d0 N& @- w/ Z
};
" y! K$ N3 x, `/ D7 Y
6 L8 u& N/ W, s8 k5 j3 j/ ?( A8 q0 o) s* c4 r) ]9 E
先前所描述的st_mode 则定义了下列数种情况:

. R% @* U1 G0 i9 M2 @) G0 o' E+ G2 w( y; F8 I$ N8 g4 S
% l" @4 s; \9 ]+ E- _
4 d$ [0 o9 r9 Y9 ]1 ~" v9 O$ c) A: o

1 k) r' Q! Z8 O5 Q0 m+ K* H/ T
9 T2 p: e; P0 u2 `* W( F* Q$ o

/ @0 T1 S7 z4 P! b  r6 M* C
作者: helendcany    时间: 2019-10-9 18:52
学习一下,谢谢分享。




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2