fstat函数

2023-05-16

stat系统调用系列包括了fstat、stat和lstat,它们都是用来返回“相关文件状态信息”的,三者的不同之处在于设定源文件的方式不同。

1

首先隆重介绍的是一个非常重要的”VIP”人物,他是fstat, stat和lstat三者都要用到的一个结构体类型,名字叫做struct stat。可以说,没有这个struct stat的支持,上述三个系统调用将寸步难行。

这个struct stat结构体在不同的UNIX/Linux系统中的定义是有小的区别的,但你完全不用担心,这并不会影响我们的使用。

在struct stat结构体中我们常用的且各个平台都一定有的域是:

st_mode 文件权限和文件类型信息 (记住这个黑体橘红色)

st_ino   与该文件关联的inode

st_dev   保存文件的设备

st_uid   文件属主的UID号

st_gid   文件属主的GID号

st_atime 文件上一次被访问的时间

st_ctime 文件的权限、属主、组或内容上一次被修改的时间

st_mtime 文件的内容上一次被修改的时间。(和st_ctime的不同之处显而易见)

st_nlink  该文件上硬连接的个数

我分别提取了solaris(UNIX)和fedora(Linux)的struct stat结构体的原始定义:大家可以自己比对一下便可以发现两者确实有所不同,但主要的域是完全相同的。

solaris的struct stat定义:

struct stat {
dev_t           st_dev;
ino_t           st_ino;
mode_t          st_mode;
nlink_t         st_nlink;
uid_t           st_uid;
gid_t           st_gid;
dev_t           st_rdev;
off_t           st_size;
timestruc_t     st_atim;
timestruc_t     st_mtim;
timestruc_t     st_ctim;
blksize_t       st_blksize;
blkcnt_t        st_blocks;
char            st_fstype[_ST_FSTYPSZ];
};

fedora的struct stat定义:

struct stat
{
__dev_t st_dev;                     /* Device.  */
unsigned short int __pad1;
__ino_t st_ino;                     /* File serial number.  */
__mode_t st_mode;                   /* File mode.  */
__nlink_t st_nlink;                 /* Link count.  */
__uid_t st_uid;                     /* User ID of the file’s owner. */
__gid_t st_gid;                     /* Group ID of the file’s group.*/
__dev_t st_rdev;                    /* Device number, if device.  */
unsigned short int __pad2;
__off_t st_size;                    /* Size of file, in bytes.  */
__blksize_t st_blksize;             /* Optimal block size for I/O.  */
__blkcnt_t st_blocks;               /* Number 512-byte blocks allocated. */
struct timespec st_atim;            /* Time of last access.  */
struct timespec st_mtim;            /* Time of last modification.  */
struct timespec st_ctim;            /* Time of last status change.  */
unsigned long int __unused4;
unsigned long int __unused5;
};

2

大家一定注意到了,在上面列举域的时候,我在st_mode处使用了黑体橘红色标识,原因在于这个域不像其他域那么容易使用,其他的域的值显而易见,而st_mode域是需要一些宏予以配合才能使用的。其实,通俗说,这些宏就是一些特定位置为1的二进制数的外号,我们使用它们和st_mode进行”&”操作,从而就可以得到某些特定的信息。

文件类型标志包括:

S_IFBLK:文件是一个特殊的块设备

S_IFDIR:文件是一个目录

S_IFCHR:文件是一个特殊的字符设备

S_IFIFO:文件是一个FIFO设备

S_IFREG:文件是一个普通文件(REG即使regular啦)

S_IFLNK:文件是一个符号链接

其他模式标志包括:

S_ISUID:文件设置了SUID位

S_ISGID:文件设置了SGID位

S_ISVTX:文件设置了sticky位

用于解释st_mode标志的掩码包括:

S_IFMT:文件类型

S_IRWXU:属主的读/写/执行权限,可以分成S_IXUSR, S_IRUSR, S_IWUSR

S_IRWXG:属组的读/写/执行权限,可以分成S_IXGRP, S_IRGRP, S_IWGRP

S_IRWXO:其他用户的读/写/执行权限,可以分为S_IXOTH, S_IROTH, S_IWOTH

还有一些用于帮助确定文件类型的宏定义,这些和上面的宏不一样,这些是带有参数的宏,类似与函数的使用方法:

S_ISBLK:测试是否是特殊的块设备文件

S_ISCHR:测试是否是特殊的字符设备文件

S_ISDIR:测试是否是目录(我估计find . -type d的源代码实现中就用到了这个宏)

S_ISFIFO:测试是否是FIFO设备

S_ISREG:测试是否是普通文件

S_ISLNK:测试是否是符号链接

S_ISSOCK:测试是否是socket

3

我们已经学习完了struct stat和各种st_mode相关宏,现在就可以拿它们和stat系统调用相互配合工作了!

int fstat(int filedes, struct stat *buf);

int stat(const char *path, struct stat *buf);

int lstat(const char *path, struct stat *buf);

聪明人一眼就能看出来fstat的第一个参数是和另外两个不一样的,对!fstat区别于另外两个系统调用的地方在于,fstat系统调用接受的是 一个“文件描述符”,而另外两个则直接接受“文件全路径”。文件描述符是需要我们用open系统调用后才能得到的,而文件全路经直接写就可以了。

stat和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。(似乎有些晕吧,这样记,lstat比stat多了一个l,因此它是有本事处理符号链接文件的,因此当遇到符号链接文件时,lstat当然不会放过。而 stat系统调用没有这个本事,它只能对符号链接文件睁一只眼闭一只眼,直接去处理链接所指文件喽)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fstat函数 的相关文章

  • Win7上从硬盘安装Debian

    最近一直想将笔记本搞成Win7 43 Debian双系统 xff0c 因为不管如何优化 xff0c 2G内存的Win7笔记本上开个Linux虚拟机都实在吃力 经过一段时间的资料搜索 xff0c 并阅读Debian官方的安装文档 xff0c
  • 深度探索C++对象模型

    深度探索C 43 43 对象模型 参考链接 第1章 关于对象 Object Lessons C 43 43 的额外成本三种对象模型简单对象模型表格驱动对象模型C 43 43 对象模型 class和struct关键字的差异三种编程典范一个类的
  • 用单片机控制直流电机

    一 设计方案比较与分析 xff1a 1 电机调速控制模块 xff1a 方案一 xff1a 采用电阻网络或数字电位器调整电动机的分压 xff0c 从而达到调速的目的 但是电阻网络只能实现有级调速 xff0c 而数字电阻的元器件价格比较昂贵 更
  • python-类

    面向对象 在编程语言中 xff0c 我们将变量看成数据 xff0c 它用来存储多种形式的值 xff1b 我们将函数看成操作 xff0c 它用来对数据进行某些处理 所有的代码都由数据和操作构成 xff0c 程序运行的本质就是对数据进行各种操作
  • 求模逆元算法的C/C++实现

    include lt stdio h gt Name Copyright Author 64 dujianjian Date 01 11 12 11 26 Description 递归 三元组gcd a b 61 61 ax 43 by 6
  • python显示当前时间

    1 先导入库 xff1a import datetime 2 获取当前日期和时间 xff1a now time 61 datetime datetime now 3 格式化成我们想要的日期 xff1a strftime xff08 xff0
  • pandas中Series的使用

    文章目录 pandas的应用创建Series对象索引花式索引布尔索引Series对象的常用属性describe 方法 xff1a value count 方法unique 方法数据处理的方法 isnull 和notnull dropna 和
  • 什么是数据挖掘

    文章目录 什么是数据挖掘1 分类问题2 聚类问题3 回归问题 数据挖掘相关的标准库 数据挖掘模型训练分类问题聚类问题回归问题关联问题 模型集成模型评估评估指标混淆矩阵与标准率指标泛化能力评估 什么是数据挖掘 数据挖掘就是寻找数据中隐含的知识
  • Json数据传递参数

    文章目录 Json数据传递参数集合参数 xff1a Json格式POJO参数 xff1a json格式集合参数 xff1a json格式 64 RequestBody与 64 RequestParam的区别时间参数的转换 Json数据传递参
  • MybatisPlus的知识点

    文章目录 MybatisPlus的知识点常用注解分页功能 条件查询方式按条件查询NULL值处理查询投影查询条件的设定字段映射与表名映射id生成策略 xff08 insert xff09 逻辑删除 xff08 Delete Update xf
  • cookie和session

    文章目录 会话跟踪技术Cookie基本使用 Session服务器重启后 xff0c Session中的数据是否还在 会话跟踪技术 会话 xff1a 用户打开浏览器 xff0c 访问web服务器的资源 xff0c 会话建立 xff0c 直到一
  • 【Django】修改端口号与地址

    在启动 Django 项目时 xff0c Django 默认监听的端口号为 8000 xff0c 设置的默认 IP 地址为 127 0 0 1 如果需要修改默认的端口号和 IP 地址 xff0c 可以通过命令行 配置文件 PyCharm 这
  • 【mdk报错】Error: L6218E: Undefined symbol XXXX (referred from main.o)

    一种情况就是没有在用户文件夹中添加文件 xff08 如LED c xff09 第二种错误 xff1a 错误描述为 xff1a OBJ Template axf Error L6218E Undefined symbol main refer
  • Codeforces 1462 C. Unique Number

    Codeforces 1462 C Unique Number 题目链接 xff1a https codeforces com problemset problem 1462 C You are given a positive numbe
  • nohup: failed to run command 'java': No such file or directory

    文章目录 问题现象 xff1a 解决办法 xff1a 问题现象 xff1a 在Ambari平台启动某个服务时 xff0c 会在ambari server节点执行类型nohup java jar XX jar这样的指令 如果把这个指令单独拿出
  • opencv学习笔记(二)-对xml和yaml文件的读写操作

    一 xml和yaml的简单介绍 所谓的xml 就是eXtensible Markup Language 翻译成中文就是 可扩展标识语言 首先XML是一种元标记语言 xff0c 所谓 元标记 就是开发者可以根据自己的需要定义自己的标记 xff
  • 图形化CentOS7.5安装Xrdp服务使通过Windows远程桌面连接

    文章目录 安装启动远程连接 安装 离线的操作系统iso中没有这个包 xff0c 这里使用阿里的yum原下载安装 span class token comment 备份本地源 span span class token function mv
  • centos7 安装FreeSWITCH1.10.7

    好长时间没有安装新的FreeSWITCH了 xff0c 只是知道1 10 4以后spandsp和sofia sip分离出来 xff0c 需要单独编译 xff0c 但上次的实际操作还是很久之前 xff0c 今天又安装了一次 xff0c 索性将
  • Golang实现字符串长度截取,支持正反向

    func main fmt Println SubStr 34 helloword 34 1 1 start xff1a 起始下标 xff0c 负数从尾部开始 xff0c 1为最后一个 length xff1a 截取长度 xff0c 负数表

随机推荐

  • 配置CDN加速域名

    cdn域名加速配置教程 xff0c 切记加速域名与源站域名不能是同一个 第一步 xff1a 打开服务器管理控制台 找到cdn管理 第二部 xff1a 配置源站信息 第三步 xff1a 点击下一步进行审批 第四步 xff1a 审批通过后进行配
  • Proxmox VE(PVE) 添加Web控制台显示CPU和主板温度

    PVE 默认是没有CPU和主板温度显示的 xff0c 为方便使用 xff0c 我们自己加上 实际效果 版本和软件 Virtual Environment 6 1 3putty 或 PVE自带的Shell 或 MobaXterm 等工具 安装
  • python logging 日志输出 学习笔记 时间格式化

    一 logging介绍 Logging是python自带的模块 xff0c 这个模块支持输出不同级别的日志 xff0c 可以输出到控制台和写入文件 xff0c 支持 TCP HTTP GET POST SMTP Socket等 协议 xff
  • vim编辑器的工作模式及切换

    vim编辑器的工作模式及切换 vim编辑器包括哪几种模式 xff0c 各自的作用是什么 xff0c 如何切换 xff1f 主要包括三种工作模式 xff1a 命令模式 xff1a 启动vim编辑器后默认进入命令模式 xff0c 该模式中主要完
  • opencv学习之(三)-LBP算法的研究及其实现

    一 xff0c 原始LBP算法 LBP的基本思想是对图像的像素和它局部周围像素进行对比后的结果进行求和 把这个像素作为中心 xff0c 对相邻像素进行阈值比较 如果中心像素的亮度大于等于他的相邻像素 xff0c 把他标记为1 xff0c 否
  • opencv学习之(五)-直方图计算和绘制图像直方图

    1 直方图 灰度直方图的定义 灰度直方图是灰度级的函数 xff0c 描述图像中该灰度级的像素个数 xff08 或该灰度级像素出现的频率 xff09 xff1a 其横坐标是灰度级 xff0c 纵坐标表示图像中该灰度级出现的个数 xff08 频
  • 学习opencv之(六)-图像切割,使用ROI

    一 ROI介绍 在OpenCV中我们能够非常方便地获取指定ROI区域的子图像 如果你对图像设置了ROI xff0c 那么 xff0c Opencv的大多数函数只在该ROI区域内运算 xff08 只处理该ROI区域 xff09 xff0c 如
  • 虚拟机Ubuntu蓝屏闪屏解决方法

    问题分析 启动 Ubuntu 可以进入登录界面 xff0c 但是系统界面蓝屏 xff0c 说明系统是可以运行起来的 证明系统是没有问题的 应该是系统插件发生了错误 没有发生大块的核心数据损坏 xff0c linux 系统一般都以修复 xff
  • meta标签清理缓存

    meta标签清理缓存 如果需要在html页面上设置不缓存 xff0c 这在 lt head gt 标签中加入如下语句 xff1a lt meta http equiv 61 34 Pragma 34 content 61 34 no cac
  • Go语言入门(二)——Ubuntu系统中Go的安装

    下载并安装 安装包地址 xff1a https golang google cn dl 选择这个下载 xff0c 稍等几秒即可 下载下来的压缩包在Downloads文件夹中 解压二进制文件 将下载的二进制包解压至 usr local目录 x
  • /etc/apt/sources.list" E212: Can't open file for writing解决方案

    w sudo tee gt dev null 解决 转载于 https www cnblogs com tangyouwei p 10109090 html
  • poj 1947 树形dp(得到含P个节点联通块的最小切边数)

    题意 xff1a 给定一颗树 xff0c 通过删除边要得到一个含有P个节点的连通块 xff0c 问最小的删边数 思路 xff1a 树形DP dp x i 记录x结点 xff0c 要得到一棵i个节点的子树去掉的最少边数 搜索到x节点时 xff
  • BMC相关

    BMC基本概念介绍 xff1a BMC xff1a 基板管理控制器 Baseboard Management Controller BMC xff08 Baseboard Management Controller xff0c 基板管理控制
  • ARM ASPEED 2500 uboot openbmc linux 启动记录

    支持原创 xff0c 转载请注明出处 ARM ASPEED 2500 uboot openbmc linux 启动记录 前言 其实openbmc 官方推荐的方法是使用Yocto poky方法来定制aspeed 2500相关的组件 xff0c
  • Serdes 原理及调试学习

    Serdes原理与设计实践之一 xff1a Serdes简介 1 Serdes简介 为了提高接口传输带宽 xff0c 设计中经常采用并行总线设计 并行总线通过提高时钟速率和数据位宽来提高传输带宽 限制接口传输带宽主要有2个方面 xff1a
  • 查看当前Linux系统的内核编译config文件,生成编译驱动所需的内核头文件

    1 xff09 查看内核配置选项 有时候我们需要查看Linux系统的内核是否在编译的时候的编译选项 xff0c 从而确定某个模块是否已经加入到内核以及参数设置等等 xff0c 方法有两种 xff1a zcat proc config gz
  • objdump adr2line定位驱动问题

    https linux kernel labs github io refs heads master labs kernel modules html https linux kernel labs github io refs head
  • debian查询命令所属软件包的方法

    在debian系统中 xff0c 类似centos的yum whatprovides这条查询系统中某个命令属于哪个安装包的命令 xff0c 有如下两类方法 xff08 离线查找和非离线查找 xff09 xff1a 第一种 xff0c 查本机
  • warning: function declaration isn’t a prototype(函数声明不是原型)的解决办法

    linux驱动中定义一个无参的函数 int probe num 警告 xff1a 函数声明不是一个原型 Wstrict prototypes 应对方法 xff1a 改成 int probe num void 警告消失
  • fstat函数

    stat系统调用系列包括了fstat stat和lstat xff0c 它们都是用来返回 相关文件状态信息 的 xff0c 三者的不同之处在于设定源文件的方式不同 1 首先隆重介绍的是一个非常重要的 VIP 人物 xff0c 他是fstat