代码详细注释:通过stat()和lstat()系统调用获取文件的详细属性信息

代码

复制代码
/*02 - 获取文件属性 */
#include <stdio.h>                      // 标准输入输出头文件
#include <stdlib.h>                     // 标准库头文件
#include <string.h>                     // 字符串处理头文件
#include <unistd.h>                     // UNIX标准头文件
#include <fcntl.h>                      // 文件控制头文件
#include <sys/types.h>                  // 系统数据类型头文件
#include <sys/stat.h>                   // 文件状态头文件
#include <sys/time.h>                   // 时间相关头文件
#include <time.h>                       // 时间处理头文件

int main(int argc, char *argv[])        // 主函数
{
    struct stat buf;                    // 定义文件状态结构体

    if(argc != 2)                       // 检查参数数量是否正确
    {
        printf("Usage: %s <link filename>\n", argv[0]);  // 打印使用说明
        exit(1);                        // 退出程序
    }

    if(stat(argv[1], &buf) == -1)       // 获取文件状态信息
    {
        perror("stat");                 // 打印错误信息
        exit(1);                        // 退出程序
    }
    //inode编号
    printf("inode number: %ld\n", buf.st_ino);  // 打印inode节点号
    //文件大小
    printf("file size: %ld\n", buf.st_size);    // 打印文件大小(字节)
    //文件类型
    printf("file type: %c\n", S_ISREG(buf.st_mode) ? '-' : 'l');  // 判断并打印文件类型
    //文件权限
    printf("file permission: 0%o\n", buf.st_mode & 0777);  // 打印文件权限(八进制)

    //最后访问时间
    printf("last access time: %s", ctime(&buf.st_atime));  // 打印最后访问时间
    //最后修改时间
    printf("last modify time: %s", ctime(&buf.st_mtime));  // 打印最后修改时间
    //最后状态改变时间
    printf("last status change time: %s", ctime(&buf.st_ctime));  // 打印最后状态改变时间

    printf("-------------------------------\n");  // 打印分隔线
    if(lstat(argv[1], &buf) == -1)      // 使用lstat获取文件状态(不跟随符号链接)
    {
        perror("stat");                 // 打印错误信息
        exit(1);                        // 退出程序
    }

    //inode编号
    printf("inode number: %ld\n", buf.st_ino);  // 再次打印inode节点号
    //文件大小
    printf("file size: %ld\n", buf.st_size);    // 再次打印文件大小
    //文件类型
    printf("file type: %c\n", S_ISREG(buf.st_mode) ? '-' : 'l');  // 再次判断并打印文件类型
    //文件权限
    printf("file permission: 0%o\n", buf.st_mode & 0777);  // 再次打印文件权限

    //最后访问时间
    printf("last access time: %s", ctime(&buf.st_atime));  // 再次打印最后访问时间
    //最后修改时间
    printf("last modify time: %s", ctime(&buf.st_mtime));  // 再次打印最后修改时间
    //最后状态改变时间
    printf("last status change time: %s", ctime(&buf.st_ctime));  // 再次打印最后状态改变时间

    return 0;                           // 程序正常结束
}

代码功能说明:

  1. 文件属性获取 :通过stat()lstat()系统调用获取文件的详细属性信息

  2. 信息展示

    • inode节点号

    • 文件大小(字节)

    • 文件类型(普通文件显示"-",符号链接显示"l")

    • 文件权限(八进制表示)

    • 三种时间戳:

      • 最后访问时间(atime)

      • 最后修改时间(mtime)

      • 最后状态改变时间(ctime)

  3. 特殊处理

    • 使用lstat()可以获取符号链接本身的信息(而非链接指向的文件)

    • 两次获取信息是为了对比stat()lstat()的区别

使用示例:

bash

复制代码
./program testfile  # 查看testfile的文件属性
相关推荐
笨笨饿14 分钟前
69_如何给自己手搓一个串口
linux·c语言·网络·单片机·嵌入式硬件·算法·个人开发
cn_lyg31 分钟前
Linux的入门级常用操作命令
linux·运维·服务器
就叫飞六吧1 小时前
TOML vs YAML:为什么 Cargo 选择 TOML?
linux·运维·服务器
IMPYLH1 小时前
Linux 的 test 命令
linux·运维·服务器·chrome·bash
xrui582 小时前
2026实战:深度解析 Gemini 3.1 镜像站函数调用在自动化运维工单中的应用
linux·服务器·网络
HackTwoHub2 小时前
Linux 内核史诗级本地提权 全网深度复现、原理完整分析( CVE-2026-31431)
linux·运维·安全·web安全·网络安全·代码审计·安全架构
她说彩礼65万2 小时前
C语言 文件
linux·服务器·c语言
txg6663 小时前
自动驾驶领域热点简报(2026-04-26 ~ 2026-05-03)
linux·人工智能·自动驾驶
二哈赛车手3 小时前
新人笔记---ES和kibana启动问题以及一些常用的linux的错误排查方法,以及ES,数据库泄密解决方案[超详细]
java·linux·数据库·spring boot·笔记·elasticsearch
嵌入式×边缘AI:打怪升级日志3 小时前
嵌入式Linux开发核心自测题(全系列精华浓缩)
java·linux·运维