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

时间: 2024-11-08 21:17:21

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

C语言学习笔记:22_结构体

/* * 22.结构体.c * * Created on: 2015年7月9日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> /** * 结构体:对共性数据的封装 * 结构体有点使用面向对象的思想,对一类东西的共性进行封闭,以便使用. * * 定义结构体: * //1>定义结构体,也可以定义在函数中(全局与局部的结构体) struct Person{ char *name;// 字符串 int age; d

APUE 学习笔记(一) Unix基础知识

1. Unix 体系结构 内核的接口被称为系统调用 公用函数库构建在系统调用接口之上 应用软件既可以调用公用函数库,也可以直接进行系统调用 2. 文件和目录 目录操作函数:opendir---> readdir---> closedir struct dirent 结构体 stat 系统调用 3.程序.进程.线程 程序:存放在磁盘上.并处于某个目录中的一个可执行文件.使用exec系列函数将程序从磁盘读入存储器,并使其执行 进程:程序的执行实体.进程控制的3个函数:fork.exec.waitp

APUE学习笔记:第七章 进程环境

7.1 引言 本章将学习:当执行程序时,其main函数是如何被调用的:命令行参数是如何传送给执行程序的:典型的存储器布局是什么样式:如何分配另外的存储空间:进程如何使用环境变量:各种不同的进程终止方式等:另外还将说明longjmp和setjmp函数以及它们与栈的交互作用:还将介绍研究进程的资源限制 7.2 main函数 C程序总是从main函数开始执行.当内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编辑器设置的,而连接编

APUE学习笔记:第四章 文件和目录

4.1 引言 本章将描述文件的特征和文件的性质 4.2 stat.fstat和lstat函数 #include<sys/stat.h> int stat(const char *restrict pathname,struct stat *restrict buf); int fstat(int filedes,struct stat *buf) int lstat(const char *restrict pathname,struct stat *restrict buf); 三个函数的返

APUE学习笔记:第一章 UNUX基础知识

1.2 UNIX体系结构 从严格意义上,可将操作系统定义为一种软件(内核),它控制计算机硬件资源,提供程序运行环境.内核的接口被称为系统调用.公用函数库构建在系统调用接口之上,应用软件即可使用公用函数库,也可使用系统调用.shell是一种特殊的应用程序,它为运行其他应用程序提供了一个接口 从广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并给予计算机以独有的特性(软件包括系统实用程序,应用软件,shell以及公用函数库等) 1.3  shell shell是一个命令行解

APUE学习笔记:第六章 系统数据文件和信息

6.1 引言 UNIX系统的正常运行需要使用大量与系统有关的数据文件,针对这些数据文件的可移植接口是本章的主题.本章还介绍了系统标识函数.时间和日期函数 6.2 口令文件 UNIX系统的口令文件包含了下列各字段,这些字段包含在<pwd.h>中定义的passwd结构中 用户名 char *pw_name 加密口令 char *pw_passwd 数值用户ID uid_t pw_uid 数值组ID gid_t pw_gid 注释字段 char *pw_gecos 初始工作目录 char *pw_d

APUE学习笔记:第八章 进程控制

8.1 引言 本章介绍UNIX的进程控制,包括创建新进程.执行程序和进程终止.还将说明进程属性的各种ID-----实际.有效和保存的用户和组ID,以及他们如何受到进程控制原语的影响.本章还包括了解释器文件和system函数.本章最后讲述大多数UNIX系统所提供的进程会计机制.这种机制使我们能够从另一个角度了解进程的控制功能. 8.2 进程标识符 每个进程都有一个非负整型表示的惟一进程ID.因为进程标识符是惟一的,常将其用作其他标识符的一部分以保证其惟一性.虽然是惟一的,但是进程ID可以重用.(大

APUE学习笔记:第五章 标准I/O库

5.1 引言 标准I/O库处理很多细节,例如缓冲区分配,以优化长度执行I/O等.这些处理不必担心如何使用正确的块长度.这使得它便于用户使用,但是如果不较深入地了解I/O库函数的操作,也会带来一些问题 5.2 流和FILE对象 对于ASCII字符集,一个字符用一个字节表示.对于国际字符集,一个字符可用多个字节表示.标准I/O文件流可用于单字节或多字节字符集. 流的定向决定了所读.写的字符是单字节还是多字节的.当一个流最初被创建时,它并没有定向.如若在未定向的流上使用一个多字节I/O函数,则将该流的

html5学习笔记(3)--主题结构元素-1

html5学习笔记(3)--主题结构元素-1 Article元素 以下为对应代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <article> <header> <h1>极客学院</h