Ubuntu 下 nginx-1.24.0 源码分析 - ngx_fd_info

ngx_fd_info


定义src\os\unix\ngx_files.h

c 复制代码
#define ngx_fd_info(fd, sb)      fstat(fd, sb)

fstat() 是 POSIX 标准中定义的一个系统调用函数,用于获取与已打开文件描述符 关联的文件状态信息。它通过填充一个 struct stat 结构体来返回文件的元数据(如大小、权限、时间戳等)。以下是详细解释:


函数原型

c 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int fstat(int fd, struct stat *sb);

参数说明

  1. fd (文件描述符)

    一个已打开的文件描述符(通过 open(), creat(), pipe() 等函数获得)。
    注意fstat() 不接受文件路径,而是直接操作已打开的文件描述符。

  2. sb (状态缓冲区)

    指向 struct stat 类型的指针,用于存储获取到的文件状态信息。


返回值

  • 成功 :返回 0
  • 失败 :返回 -1,并设置全局变量 errno 表示错误原因。

struct stat 结构体

fstat() 的核心是填充 struct stat 结构体,其典型定义如下(可能因系统不同略有差异):

c 复制代码
struct stat {
    dev_t     st_dev;      // 文件所在设备的 ID
    ino_t     st_ino;      // 文件的 inode 号
    mode_t    st_mode;     // 文件类型和权限(如 S_IFREG、S_IRUSR 等)
    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;   // 分配的磁盘块数(512 字节为单位)
    time_t    st_atime;    // 最后访问时间(秒级时间戳)
    time_t    st_mtime;    // 最后修改时间(内容修改)
    time_t    st_ctime;    // 最后状态变化时间(元数据修改)
};

功能与用途

fstat() 的主要用途是获取已打开文件的元数据,适用于以下场景:

  1. 检查文件类型(普通文件、目录、符号链接、设备文件等)。
  2. 获取文件大小(st_size)。
  3. 检查文件权限(st_mode 中的 S_IRUSR, S_IWGRP 等)。
  4. 判断文件是否为符号链接(需配合 lstat() 使用)。
  5. 获取文件的时间戳(访问时间、修改时间等)。

相关推荐
大树888 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠8 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质8 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工10 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智10 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_10 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉11 小时前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦12 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj12 小时前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
lsyeei12 小时前
linux 系统目录详解
linux·运维·服务器