以下不少内容来自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就不追溯到符号链接所指向的具体文件,而是获取符号链接文件本身的文件信息。在默认情况下,会获取符号链接所链接的文件。


APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍的更多相关文章

  1. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

  2. matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields

    一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...

  3. matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段

    一起来学matlab-matlab学习笔记12 12_2 结构体 创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段 觉得有用的话 ...

  4. Swift 学习笔记 (类和结构体)

    类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...

  5. C#学习笔记_12_枚举&结构体

    12_枚举&结构体 枚举 是一种数据类型 适用于某些取值范围有限的数据 语法: [访问权限修饰符] enum 枚举名 { 枚举值 } 枚举名遵循大驼峰命名法 枚举一般情况下是和switch c ...

  6. C#学习笔记05--枚举/结构体

    一.枚举   当变量的取值范围是固定的几个时, 就可以使用枚举类型, 这样会更加简洁方便   1.1.定义: 访问修饰符 enum 枚举类型名 { 成员1, 成员2, 成员3, ... } publi ...

  7. Go语言学习笔记(四)结构体struct & 接口Interface & 反射

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  8. Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  9. (转) C/C++中结构体(struct)知识点强化

    本文转载于 http://pcedu.pconline.com.cn/empolder/gj/c/0503/567942_all.html#content_page_1 所有程序经过本人验证,部分程序 ...

随机推荐

  1. Swoole学习(七)Swoole之异步TCP服务器的创建

    环境:Centos6.4,PHP环境:PHP7 <?php //创建TCP服务器 /** * $host 是swoole需要监听的ip,如果要监听本地,不对外服务,那么就是127.0.0.1;如 ...

  2. vsftpd搭建ftp服务,并实现虚拟用户访问

    安装vsftpd服务: yum install vsftpd -y [root@wadeson ~]# rpm -ql vsftpd /etc/logrotate.d/vsftpd /etc/pam. ...

  3. 20145310 《Java程序设计》第1周学习总结

    20145310 <Java程序设计>第1周学习总结 教材学习内容总结 第一周主要学习教材前两章的知识.第一章主要学习了java的历史,版本的迁移以及一些相关的专有名词之间的联系和下载安装 ...

  4. 20144303 《Java程序设计》第二次实验实验报告

    20144303 <Java程序设计>第二次实验实验报告 北京电子科技学院(besti)实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握U ...

  5. 比较字符串CompareTo的用法及注意

    CompareTo用法 static void Main(string[] args)         {             string str = "1";        ...

  6. 如何打开linux内核中dev_dbg的开关

    比如要打开某个驱动中的dev_dbg,那么需要在驱动文件.c中这些行"<linux/device.h>"或者"<linux /platfom_devic ...

  7. C++ 单词接龙

    问题描述: 拉姆刚刚开始学习英文字母,对单词排序很感兴趣,他能够迅速确定是否可以将这些单词排列在一个列表中,使得该列表中任何单词的首字母与前一个单词的尾字母相同,力能编写一个计算机程序帮助拉姆进行判断 ...

  8. 正则表达式-RegExp-常用正则表达式

    正则表达式-RegExp-常用正则表达式   作者:nuysoft/JS攻城师/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源 ...

  9. 无法读取服务器服务中的服务器队列性能数据。数据段的第一个四字节 (DWORD) 中包

    无法打开服务器服务性能对象.数据段的第一个四字节 (DWORD) 包含状态代码. 解决方法:修改注册表禁用PerfNet性能计数器. 具体方法:打开注册表,在HKEY_LOCAL_MACHINE\SY ...

  10. sleep(),wait(),yield()和join()方法的区别

    sleep() sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级 的线程得到执行的机会,也可以让低优先级的线 ...