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. 获取文件的时间戳(访问时间、修改时间等)。

相关推荐
苹果醋335 分钟前
AI大模型竞赛升温:百度发布文心大模型4.5和X1
java·运维·spring boot·mysql·nginx
liulilittle2 小时前
OpenSSL 的 AES-NI 支持机制
linux·运维·服务器·算法·加密·openssl·解密
风清再凯3 小时前
docker镜像的构建image
运维·docker·容器
饭碗、碗碗香3 小时前
【开发常用命令】:docker常用命令
linux·运维·笔记·学习·docker·容器
鸡鸭扣3 小时前
25年春招:米哈游运维开发一面总结
运维·面试·求职招聘·运维开发·面经·sre·米哈游
Auv开心3 小时前
ubuntu22.04和ubuntu20.04 的ssh配置不然repo init失败
运维·ssh
SZ1701102314 小时前
IGP(Interior Gateway Protocol,内部网关协议)
运维·服务器·gateway
天外来物4 小时前
实战分享:用CI/CD实现持续部署
前端·nginx·docker
moxiaoran57534 小时前
Spring Cloud Gateway 动态路由实现方案
运维·服务器·前端
运维日常手记4 小时前
最新1.33.1 k8s高可用集群搭建(免翻墙)
运维