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

相关推荐
理智的煎蛋18 分钟前
GPU 服务器压力测试核心工具全解析:gpu-burn、cpu-burn 与 CUDA Samples
运维·服务器·人工智能·压力测试·gpu算力
SEO_juper41 分钟前
SEO新手入门:什么是SEO及其作用
运维·服务器·搜索引擎·seo·数字营销·seo优化
无痕melody1 小时前
报错Failed to set ntp: NTP not supported
运维
ZYMFZ2 小时前
Linux 防火墙 Firewalld
linux·运维·服务器
yzx9910137 小时前
生活在数字世界:一份人人都能看懂的网络安全生存指南
运维·开发语言·网络·人工智能·自动化
橙*^O^*安8 小时前
Go 语言基础:变量与常量
运维·开发语言·后端·golang·kubernetes
阿拉斯加大闸蟹10 小时前
基于RDMA 通信的可负载均衡高性能服务架构
运维·架构·负载均衡
不是吧这都有重名11 小时前
为什么ubuntu大文件拷贝会先快后慢?
linux·运维·ubuntu
sunshine-sm11 小时前
CentOS Steam 9安装 Redis
linux·运维·服务器·redis·centos
棒棒的唐12 小时前
armbian平台ubuntu环境下telnet安装及启动,给pantherX2增加一个应急通道
linux·运维·armbian·telnetd