fstat函数及struct stat结构

2023-11-01

转载地址:点击打开链接



一、fstat 函数


功能:由文件描述符取得文件状态。
相关函数:stat 、lstat 、chmod 、chown 、readlink 、utime。
头文件:   #include <sys/stat.h>
               #include <unistd.h>
函数声明: int fstat (int filedes,struct *buf);
描述: fstat()用来将参数filedes 所指向的文件状态复制到参数buf 所指向的结构中(struct stat)。fstat()与stat()作用完全相同,不同之处在于传入的参数为已打开的文件描述符。
返回值:执行成功返回0,失败返回-1,错误代码保存在errno。
下面举一个小例子:
------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
main()
{
                  struct   stat buf;
                  int fd;
                  fd = open ( "/etc/passwd", O_RDONLY);
                  fstat (fd, &buf);
                  printf("/etc/passwd file size = %d\n",(int)(buf.st_size));
}
------------------------------
执行结果:
/etc/passwd file size = 1656
    
也许,你看到这里会产生和我一样的疑惑:这个struct stat 结构到底是什么样的呢?
下面我就来详细的介绍一下它了哦~~~          


二、struct stat结构体

定义如下:

struct stat { 
         dev_t st_dev; // 文件所在设备ID 
         ino_t st_ino; // 结点(inode)编号  
         mode_t st_mode; // 保护模式 
         nlink_t st_nlink; // 硬链接个数  
         uid_t st_uid; // 所有者用户ID  
         gid_t st_gid; // 所有者组ID  
         dev_t st_rdev; // 设备ID(如果是特殊文件) 
         off_t st_size; // 总体尺寸,以字节为单位 
         blksize_t st_blksize; // 文件系统 I/O 块大小
         blkcnt_t st_blocks; // 已分配 512B 块个数
         time_t st_atime; // 上次访问时间 
         time_t st_mtime; // 上次更新时间 
         time_t st_ctime; // 上次状态更改时间 
};

st_dev 字段描述该文件所在的设备。(major() 和minor()宏可能在分析这个设备ID域时有用。)

st_rdev 字段描述这个文件(inode)本身代表的设备。

st_size 字段给出文件字节尺寸(如果它是一个普通文件或符号链接)。对于符号链接而言是它所有包含路径名长度,不包括结尾的空字符。

st_blocks 字段指明文件已经分配数据块的个数,数据块以 512 字节为单位。(这可能小于 st_size/512,当文件有空洞时。)

st_blksize 给出对于高效文件系统 I/O 操作的优先块尺寸。(数据以小尺寸块写入文件时可能导致低效的 读-更改-覆盖 操作。)

不是所有的 Linux 文件系统实现了所有的时间域。一些文件系统允许挂载时不去访问文件或目录且不会导致st_atime 字段更新。(参考 mount() 的 noatimenodiratime 和 relatime,以及mount() 中相关的信息。)此外,如果文件以 O_NOATIME 标志打开,st_atime 不会被更新。

st_atime 字段在文件访问时更改,比如,execve()、mknod()、pipe()、utime() 和read()(多于零个字节)。

域 st_mtime 在文件更改时更新,比如,mknod()、truncate()、utime() 和 write()(多于零个字节)。再者,一个目录的 st_mtime 在这个目录里创建或删除文件时更新。st_mtime 在更改所有者、组、硬链接个数或权限模式时 不会 更新。

st_ctime 字段在写入或设置结点(inode)信息(如所有者、组、链接数、权限等等)时会更改。

下面 POSIX 宏用于使用 st_mode 字段测试文件类型:

S_ISREG(m)
它是普通文件吗?
S_ISDIR(m)
目录吗?
S_ISCHR(m)
字符设备?
S_ISBLK(m)
块设备?
S_ISFIFO(m)
FIFO(命名管道)?
S_ISLNK(m)
符号链接?(不在 POSIX.1-1996。)
S_ISSOCK(m)
套接口?(不在 POSIX.1-1996。)

下面标志为 st_mode 域定义:

S_IFMT 0170000 文件类型位域掩码
S_IFSOCK 0140000 套接口
S_IFLNK 0120000 符号链接
S_IFREG 0100000 普通文件
S_IFBLK 0060000 块设备
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符设备
S_IFIFO 0010000 FIFO
S_ISUID 0004000 设置 UID 位
S_ISGID 0002000 设置 组ID 位 (看下面)
S_ISVTX 0001000 粘滞位(看下面)
S_IRWXU 00700 文件所有者权限掩码
S_IRUSR 00400 所有者有读权限
S_IWUSR 00200 所有者有写权限
S_IXUSR 00100 所有者有执行权限
S_IRWXG 00070 组权限掩码
S_IRGRP 00040 组有读权限
S_IWGRP 00020 组有写权限
S_IXGRP 00010 组有执行权限
S_IRWXO 00007 其他用户权限掩码(不在组内)
S_IROTH 00004 其他有读权限
S_IWOTH 00002 其他有写权限
S_IXOTH 00001 其他有执行权限

设置组ID位S_ISGID)有多个特殊用处。对于一个目录而言,它指明 BSD 语义应用到这个目录;创建的文件继承其父目录的组ID,而不是来自创建进程的有效组ID,并且创建的目录同时也会获得 S_SIGID 位设置。对于一个没有组执行权限位(S_IXGRP)文件而言,设置组ID位用于指明托管文件/记录锁。

在目录上的粘滞位(S_ISVTX)表示目录里的文件只有其所有者,目录所有者,和特权进程,可以对其进行重命名或删除。


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

fstat函数及struct stat结构 的相关文章

  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少

随机推荐

  • vscode的默认设置(配置)列表

    默认设置 详细 以下是Visual Studio代码的默认设置及其值 您还可以在 设置 编辑器中查看默认值 Editor Controls whether the diff editor shows changes in leading o
  • 史上最详细的UE4安装教程(没有之一,就是史上最详细,不服气你来打我呀)

    知识兔这篇文章为大家带来了史上最详细的UE4安装教程 没有之一 就是史上最详细 不服气你来打我呀 主要包含下面几个部分 0 软硬件配置 1 创建Epic Games账户 2 下载和安装启动器 3 登陆启动器 这块有话说 4 安装UE4 5
  • 2023阿里云学生服务器权益,含Clouder认证:云服务器ECS答案

    文章目录 阿里云学生权益 服务器使用7个月 1 高校计划续费任务 飞天加速计划3 0 2个任务 2 任务1 完成实验 ECS云服务器新手上路 2 2 续费6个月 3 任务2 Apsara Clouder云计算专项技能认证 云服务器ECS入门
  • 爱,死亡和机器人(Love,Death&Robots)

    从我自己的角度来讲 我真的是很喜欢这部短片 奇幻 科幻 喜剧交叉在一起构成了这18部短片 精彩绝伦 我只能这么去形容 但是有没有不足呢 客观的来说 也存在不足 过度的吹捧使得有些人神话了它 认为立意不够 题材老套 但这无法掩盖这部优秀作品的
  • Java创建型模式之原型模式

    原型模式 所谓原型模式 就是以一个对象为原型 返回这个对象的克隆 而不是创建一个新的对象 原型对象的优点 在Java中创建一个新对是昂贵和资源密集型 原型对象有助于创建更好性能的重复对象 原型模式的核心就是克隆 克隆又分为浅克隆 深克隆 1
  • Navicat Premium 15 安装教程

    安装教程 1 鼠标右击 Navicat Premium 15 64bit 压缩包 win11及以上系统需先选择 显示更多选项 选择 解压到 Navicat Premium 15 64bit 2 打开解压后的文件夹 鼠标右击 setup 选择
  • java 获取今天是星期几

    java 获取今天是星期几 public class Test public static void main String args String weekDays 星期日 星期一 星期二 星期三 星期四 星期五 星期六 Calendar
  • SpringBoot 解决跨域问题

    问题描述 启动前端遇到跨域问题 原因分析 后端设置的端口号和前端的端口号不同 此时我的后端端口号为 9090 前端端口号为 8080 导致前后端数据交互不成功报错 解决方案 在Springboot项目里加上这个配置文件CorsConfig
  • Linux CentOS-7 系统 离线安装部署Zabbix--->自定义监控--->短信报警 详细教程

    在内网环境 我们无法连接外网 这个时候想要使用zabbix 就要进行离线安装了 安装部署zabbix有三种方法 一是使用源码安装 二是使用RPM包安装 三是使用容器部署 这里讲的是RPM包安装 可以自己线上下载包 也可以用我已经准备好的RP
  • Past, Present, and Future of Simultaneous Localization and Mapping: Toward the Robust-Perception Age

    这是笔者对这篇论文的翻译 Past Present and Future of Simultaneous Localization and Mapping Toward the Robust Perception Age是一篇SLAM领域的
  • MOSFET导通、关断过程详细分析、损耗分析、米勒效应、datasheet解释

    一 MOSFET导通 关断过程详细分析 转 详见下 MOSFET导通 关断过程详细分析 转 知乎 二 弄懂mosfet的导通过程和损耗分析 详见下 弄懂MOS管的导通过程和损耗分析 三 MOSFET datasheet 的数据解释 深入理解
  • linux下用eclipse编译c++的pthread多线程配置

    问题 eclipse使用pthread h遇到 pthread create 未定义的问题 解决方法 a 需要在编译时添加 lpthread参数 g XXXXX cpp lpthread o XXXXX o b 在eclipse中配置 pr
  • Excel VBA宏

    一 宏与VBA 什么是宏与VBA VBA Visual Basic for Applications 是 Visual Basic https baike baidu com item Visual Basic 的一种宏语言 是在其桌面应用
  • Spring Boot中JSON的数据结构和交互讲解以及实战(超详细 附源码)

    Spring MVC在数据绑定的过程中 需要对传递数据的格式和类型进行转换 它既可以转换String登类型的数据 也可以转换JSON等其他类型的数据 JSON数据结构 JSON JavaScript Object Notation JS对象
  • 吃透Chisel语言.10.Chisel项目构建、运行和测试(二)——Chisel中生成Verilog代码&Chisel开发流程

    Chisel项目构建 运行和测试 二 Chisel中生成Verilog代码 Chisel开发流程 上一篇文章我们提到了怎么用sbt构建Chisel项目并运行Chisel代码 但是毕竟还是在电脑上运行的 而在实践中 我们写的Chisel代码最
  • 51nod-1101 换零钱

    时间限制 1 秒 空间限制 65536 KB 分值 20 N元钱换为零钱 有多少不同的换法 币值包括1 2 5分 1 2 5角 1 2 5 10 20 50 100元 例如 5分钱换为零钱 有以下4种换法 1 5个1分 2 1个2分3个1分
  • FreeRTOS 临界段和开关中断

    以下转载自安富莱电子 http forum armfly com forum php 临界段代码的临界段也称为临界区 一旦这部分代码开始执行 则不允许任何中断打断 为确保临界段代码的执行不被中断 在进入临界段之前须关中断 而临界段代码执行完
  • AIGC来了,品牌方开始要求降价|AI重塑未来营销

    AIGC正在重塑营销领域 为品牌带来新的解决方案 营销可能是最早与AIGC结合并产生实际落地效果的领域之一 然而 需要注意AI工具的局限性和过度精准投放的影响 个性化的营销内容重要 但难以塑造国民级品牌 在AI时代 品牌需要找到自己的最大公
  • pycharm安装教程(安装必看)

    文章目录 软件简介 一 pycharm下载 二 安装 三 使用pycharm 软件简介 PyCharm是一种Python IDE Integrated Development Environment 集成开发环境 带有一整套可以帮助用户在使
  • fstat函数及struct stat结构

    转载地址 点击打开链接 一 fstat 函数 功能 由文件描述符取得文件状态 相关函数 stat lstat chmod chown readlink utime 头文件 include