如何阅读理解用户手册里的函数文档, 以man 2 stat举例

阅读和理解用户手册里的函数文档,尤其是像 man 2 stat 这样的系统调用手册,是 Linux/Unix 系统编程的基本功。下面给一套通用方法 + man 2 stat 实例拆解,学会读懂这类文档

一、先搞清楚 man 手册的分区

Linux 的 man 手册分章节,不同章节编号代表不同类型的文档:

章节 内容类型 示例
1 用户命令 man 1 ls
2 系统调用(内核API) man 2 stat
3 库函数(C标准库) man 3 printf
4 设备文件 man 4 tty
5 文件格式/协议 man 5 passwd
7 概述、杂项 man 7 glob
8 系统管理命令 man 8 mount

man 2 stat 表示查第 2 章 (系统调用)的 stat 函数。

二、通用阅读步骤(以 man 2 stat 为例)

1. 先看 NAME 部分(函数名和基本作用)

复制代码
复制代码
STAT(2)                    Linux Programmer's Manual                   STAT(2)

NAME
       stat, fstat, lstat, fstatat - get file status
  • 作用:一句话概括函数功能------获取文件的状态信息(元数据:大小、权限、修改时间等)。
  • 这里列出了 4 个相关函数:stat、fstat、lstat、fstatat,它们的功能类似但适用场景不同。

2. 看 SYNOPSIS 部分(函数原型)

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

       int stat(const char *pathname, struct stat *statbuf);
       int fstat(int fd, struct stat *statbuf);
       int lstat(const char *pathname, struct stat *statbuf);
       ...
  • 头文件 :必须包含这些头文件才能使用该函数(sys/types.h 定义类型,sys/stat.h 定义 struct stat,unistd.h 是系统调用惯例)。
  • 函数原型 :每个函数的参数和返回值一目了然:
    • stat:参数是文件路径 (pathname)和存放结果的缓冲区 (statbuf)。
    • fstat:参数是文件描述符 (fd)和缓冲区。
    • lstat:类似 stat,但对符号链接的处理不同(后面讲区别)。

3. 看 DESCRIPTION 部分(详细说明)

这是核心,会解释:

  • 函数功能细节 :比如 stat 返回的是路径名对应的文件 (如果是符号链接,会追踪到目标文件),而 lstat 返回的是符号链接本身的信息。
  • 参数含义 :
    • pathname:要查询的文件路径(字符串)。
    • statbuf:指向 struct stat 结构体的指针,函数会把文件状态信息写入这个结构体。
  • 返回值 :成功返回 0,失败返回 -1 并设置 errno(错误码)。
  • 关键区别 :stat vs lstat vs fstat:
    • stat(path, buf):追踪符号链接(如果 path 是软链接,返回目标文件的状态)。
    • lstat(path, buf):不追踪符号链接(返回软链接本身的状态)。
    • fstat(fd, buf):通过已打开的文件描述符 fd 获取状态(不需要路径)。

4. 看 struct stat 结构体定义(重点!)

在 DESCRIPTION 中会给出结构体成员,或者在手册的其他部分(有时需要往下翻):

复制代码
复制代码
The stat structure is defined as follows:

struct stat {
    dev_t     st_dev;         /* ID of device containing file */
    ino_t     st_ino;         /* inode number */
    mode_t    st_mode;        /* file type and mode */
    nlink_t   st_nlink;       /* number of hard links */
    uid_t     st_uid;         /* user ID of owner */
    gid_t     st_gid;         /* group ID of owner */
    dev_t     st_rdev;        /* device ID (if special file) */
    off_t     st_size;        /* total size, in bytes */
    blksize_t st_blksize;     /* blocksize for filesystem I/O */
    blkcnt_t  st_blocks;      /* number of 512B blocks allocated */

    /* Since Linux 2.6, the kernel supports nanosecond
       precision for the following timestamp fields.
       For the details before Linux 2.6, see NOTES. */

    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 */

    #define st_atime st_atim.tv_sec      /* Backward compatibility */
    #define st_mtime st_mtim.tv_sec
    #define st_ctime st_ctim.tv_sec
};
  • 每个字段的含义 :比如 st_size 是文件大小(字节),st_mode 包含文件类型和权限(需要用宏判断文件类型,如 S_ISREG(st_mode) 判断是否为普通文件)。
  • 时间戳 :st_atim 是最后访问时间,st_mtim 是最后修改时间,st_ctim 是最后状态改变时间(如权限修改)。

5. 看 RETURN VALUE 部分(返回值说明)

复制代码
复制代码
RETURN VALUE
       On success, zero is returned.  On error, -1 is returned, and errno is set appropriately.
  • 成功 → 0;失败 → -1,并通过 errno 告知错误原因(如文件不存在、权限不足)。

6. 看 ERRORS 部分(可能的错误码)

复制代码
复制代码
ERRORS
       EACCES Search permission is denied for one of the directories in the path prefix of pathname.
       EBADF  fd is not a valid open file descriptor.

       EFAULT Bad address.

       ELOOP  Too many symbolic links encountered while traversing pathname.

       ENAMETOOLONG
              pathname is too long.

       ENOENT A component of pathname does not exist.
       ...
  • 列举了所有可能的错误情况,比如 ENOENT 表示文件不存在,EACCES 表示权限不足。
  • 调试时可以根据 errno 的值判断错误原因(用 perror 或 strerror 打印)。

7. 看 EXAMPLES 部分(示例代码,有的手册有)

有些函数的 man 页会提供使用示例,比如 stat 可能会有一个简单的 demo:打开文件、调用 stat、打印文件大小。

如果没示例,可以参考网上或自己写测试代码。

8. 看 SEE ALSO 部分(相关参考)

列出相关的函数或手册,比如 stat(2) 的 SEE ALSO 可能有 lstat(2)、fstat(2)、inode(7)(inode 介绍)等,方便深入学习。

三、关键技巧:如何高效抓重点?

  1. 先看 SYNOPSIS 知道怎么用(函数原型、头文件)。
  2. 再看 DESCRIPTION 懂功能和参数 (尤其是和其他类似函数的区别,如 stat vs lstat)。
  3. 重点看 struct 定义(要知道能获取哪些信息,比如文件大小、权限、时间)。
  4. 记住 RETURN VALUE 和 ERRORS(写代码时处理成功和失败的情况)。
  5. 不懂的术语查 SEE ALSO (比如 inode 是什么,可以去 man 7 inode 看)。

四、以 man 2 stat 为例的小练习

假设你要写一个程序,获取当前目录下 test.txt 的大小和修改时间:

  1. 包含头文件:#include <sys/stat.h>、#include <unistd.h>。
  2. 定义 struct stat sb; 和 char *path = "test.txt";。
  3. 调用 stat(path, &sb);(检查返回值是否为 -1,处理错误)。
  4. 用 sb.st_size 获取大小,用 sb.st_mtim 获取修改时间(st_mtim.tv_sec 是秒,st_mtim.tv_nsec 是纳秒)。

通过这样的步骤,你就能系统地理解任何一个函数手册,并且能正确使用它。核心是不要被大段英文吓到,分模块拆解,抓关键信息。

相关推荐
wtblszn3 小时前
自动化包装生产线设备可视化管理方案
运维·自动化
心之语歌4 小时前
Tkinter 画布基本梳理
运维·服务器·python
Shulex5 小时前
面向跨境电商多渠道消息系统的技术架构:亚马逊站内信合规对接与自动化执行链路设计
运维·架构·自动化
bloglin999995 小时前
vmware部署centos7启动docker容器后无法访问服务
运维·docker·容器
夜听莺儿鸣5 小时前
502-003_Linux 中断与异常(一):从Linux角度理解中断与异常
linux·中断与异常·linux中断
杨云龙UP6 小时前
TDengine 3.4.2.8 Community 三节点三副本生产集群部署实战(DNode/MNode/taosAdapter/Explorer)
大数据·linux·运维·数据库·tdengine·时序库
梦帮科技6 小时前
领域认知知识库图谱注入:从双式记账图网络到高质量问答对自动化合成流水线
运维·网络·数据库·人工智能·矩阵·架构·自动化
向成科技7 小时前
XC3576H工控主板|深度适配Ubuntu 26.04 LTS,释放边缘AI与工业开发新潜能
linux·人工智能·ubuntu·机器人·硬件·主板·边缘ai
逐流人7 小时前
Ceph分布式存储集群配置与池管理:从配置优先级到PG、复本池与纠删码池
运维·分布式·ceph·云原生·云计算·rados
海宇服务7 小时前
零信任架构实战:基于海宇车型识别精准构建自动化定损网关
运维·人工智能·架构·自动化