zoukankan      html  css  js  c++  java
  • APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍

    以下不少内容来自man手册

    结构体struct stat

            结构体struct stat用于保存文件相关的所有信息。
            struct stat的基本成员如下所示
    1. struct stat {
    2. dev_t st_dev; // 文件所在设备的设备id,可以分解为主设备号和此设备号
    3. ino_t st_ino; // inode号
    4. mode_t st_mode; // 文件的类型、存取权限等
    5. nlink_t st_nlink; // 文件硬连接数
    6. uid_t st_uid; // 文件拥有者的用户id
    7. gid_t st_gid; // 文件拥有者的组id
    8. dev_t st_rdev; // 特殊文件的设备id
    9. off_t st_size; // 总的size,总字节数,用bytes计量
    10. blksize_t st_blksize; // 文件系统I/O有效率的“首选”的块大小,进行I/O的块大小
    11. blkcnt_t st_blocks; // 分配给文件块数量,以512-byte为单位,可能存在hole,所以可能小于st_size/512
    12. time_t st_atime; // 最后访问的时间
    13. time_t st_mtime; // 最后修改的时间
    14. time_t st_ctime; // 最后一次发生状态改变的时间(如owner、mode、link数等等)
    15. };
        说明:
        st_dev为unsigned int 类型,其中高12位为主设备号(用宏MAJOR(st_dev)获得),低20位为此设备号(用宏MINOR(dev_t dev)分解获取),
        并不是所有的系统都支持st_atime st_mtime st_ctime全部的。
        st_mode表示文件的模式、类型、存取权限。用特征位的形式表现。
        mode_t实际上是一个unsigned short类型
    1. S_IFMT 0170000 文件类型的位遮罩
    2. S_IFSOCK 0140000 socket
    3. S_IFLNK 0120000 符号链接(symbolic link)
    4. S_IFREG 0100000 一般文件
    5. S_IFBLK 0060000 区块装置(block device)
    6. S_IFDIR 0040000 目录
    7. S_IFCHR 0020000 字符装置(character device)
    8. S_IFIFO 0010000 先进先出(fifo)
    9. S_ISUID 0004000 文件的(set user-id on execution)位
    10. S_ISGID 0002000 文件的(set group-id on execution)位
    11. S_ISVTX 0001000 文件的sticky
    12. S_IRWXU 00700 文件所有者的遮罩值(即所有权限值)
    13. S_IRUSR 00400 文件所有者具可读取权限
    14. S_IWUSR 00200 文件所有者具可写入权限
    15. S_IXUSR 00100 文件所有者具可执行权限
    16. S_IRWXG 00070 用户组的遮罩值(即所有权限值)
    17. S_IRGRP 00040 用户组具可读取权限
    18. S_IWGRP 00020 用户组具可写入权限
    19. S_IXGRP 00010 用户组具可执行权限
    20. S_IRWXO 00007 其他用户的遮罩值(即所有权限值)
    21. S_IROTH 00004 其他用户具可读取权限
    22. S_IWOTH 00002 其他用户具可写入权限
    23. S_IXOTH 00001 其他用户具可执行权限
            要知道文件的类型,可以用文件的st_mode与特征位相与,在进行比较。比如我们要判断文件的是否为一般文件,可以用下面代码来判断
    1. (buf.st_mode & S_IFREG) == S_IFREG

        还有一种简单的方法可以获取文件的基本类型
    1. S_ISREG(s_tmode) is it a regular file?
    2. S_ISDIR(s_tmode) directory?
    3. S_ISCHR(s_tmode) character device?
    4. S_ISBLK(s_tmode) block device?
    5. S_ISFIFO(s_tmode) FIFO (named pipe)?
    6. S_ISLNK(s_tmode) symbolic link? (Not in POSIX.1-1996.)
    7. S_ISSOCK(s_tmode) socket? (Not in POSIX.1-1996.)

    stat,fstat和lstat

        已知struct stat保存了文件几乎所有的信息,那么如何获取文件的stat呢? 函数stat(),fstat(),lstat(),fstatat()实现了获取文件stat结构的方法
    1. #include <sys/stat.h>
    2. int stat(const char *restrict pathname,struct stat *restrict buf);
    3. int fstat(int fd,struct stat *buf);
    4. int lstat(const char *restrict pathname,struct stat *restrict buf);
    5. int fstatat(int fd,const char *restrict pathname,struct stat *restrict buf,int flag);
    6. All four return: 0 if OK,−1 on error
            stat()与获取一个路径的文件信息。
            fstat()通过一打开的文件的文件描述符获取文件信息
            lstat()通过路径获取文件的文件信息。如果该路径是一个符号链接,则获取该符号链接的文件信息,而不是其指向的文件。

            fstatat() 提供了通过 相对于打开的文件描述符fd的 相对路径 来获取文件信息的方法。该函数有两个关键点:
            1.也就是说,在fstatat()中,如果pathname使用的是相对路径,那么pathname是相对于fd的路径,而不是相对于当前目录。但是,如果fd被置为AT_FDCWD,那就是相对于当前目录了。
            2.关于flag参数,如果flag被置为AT_SYMLINK_NOFOLLOW,那么fstatat就不追溯到符号链接所指向的具体文件,而是获取符号链接文件本身的文件信息。在默认情况下,会获取符号链接所链接的文件。



  • 相关阅读:
    AT2165 Median Pyramid Hard
    AT2160 へんなコンパス / Manhattan Compass
    bzoj2863:愤怒的元首
    bzoj5336:[TJOI2018]party
    [luoguP3768]简单的数学题
    bzoj1831:[AHOI2008]逆序对
    bzoj5492:[Hnoi2019]校园旅行
    HNOI2019游记
    HDU 1102 Constructing Roads(kruskal)
    HDU 1059 Dividing
  • 原文地址:https://www.cnblogs.com/Windeal/p/4284662.html
Copyright © 2011-2022 走看看