当前位置: 首页 > news >正文

Linux 系统调用 stat 完全用例

stat 和 fstat 的主要区别在于获取文件属性的方式:

  1. stat 通过 文件名(路径) 直接获取文件属性,无需预先打开文件,适用于仅需查询属性而不操作文件内容的场景。
  2. fstat 通过 文件描述符(fd) 获取属性,要求文件必须已通过 open 等函数打开。其优势在于直接从内存读取动态文件的属性,效率更高,适合已打开文件的情况。

选择建议:
• 若仅需检查文件属性且文件未打开,使用 stat 避免额外开销;

• 若文件已打开(如正在读写),优先用 fstat 减少磁盘访问。

两者的返回信息均存储在 struct stat 结构体中,包含文件类型、权限、时间戳等元数据。

#include <stdio.h>
#include <sys/stat.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>// 打印权限位
void print_permissions(mode_t mode) {printf( (S_ISDIR(mode)) ? "d" : "-");printf( (mode & S_IRUSR) ? "r" : "-");printf( (mode & S_IWUSR) ? "w" : "-");printf( (mode & S_IXUSR) ? "x" : "-");printf( (mode & S_IRGRP) ? "r" : "-");printf( (mode & S_IWGRP) ? "w" : "-");printf( (mode & S_IXGRP) ? "x" : "-");printf( (mode & S_IROTH) ? "r" : "-");printf( (mode & S_IWOTH) ? "w" : "-");printf( (mode & S_IXOTH) ? "x" : "-");
}// 打印文件类型
const char* file_type(mode_t mode) {if (S_ISREG(mode)) return "普通文件";if (S_ISDIR(mode)) return "目录";if (S_ISCHR(mode)) return "字符设备";if (S_ISBLK(mode)) return "块设备";if (S_ISFIFO(mode)) return "FIFO/管道";if (S_ISLNK(mode)) return "符号链接";if (S_ISSOCK(mode)) return "套接字";return "未知类型";
}int main(int argc, char *argv[]) {if (argc != 2) {fprintf(stderr, "用法: %s <文件路径>\n", argv[0]);return EXIT_FAILURE;}const char *filepath = argv[1];struct stat st;// 调用 stat 获取文件信息if (stat(filepath, &st) == -1) {fprintf(stderr, "stat 失败: %s\n", strerror(errno));return EXIT_FAILURE;}printf("文件: %s\n", filepath);printf("文件类型: %s\n", file_type(st.st_mode));printf("权限: ");print_permissions(st.st_mode);printf("\n");printf("节点号: %lu\n", (unsigned long)st.st_ino);printf("设备号: %lu\n", (unsigned long)st.st_dev);printf("硬链接数: %lu\n", (unsigned long)st.st_nlink);printf("用户ID: %u", st.st_uid);struct passwd *pw = getpwuid(st.st_uid);if (pw) printf(" (%s)", pw->pw_name);printf("\n");printf("组ID: %u", st.st_gid);struct group *gr = getgrgid(st.st_gid);if (gr) printf(" (%s)", gr->gr_name);printf("\n");printf("文件大小: %lld 字节\n", (long long)st.st_size);printf("块大小: %lld 字节\n", (long long)st.st_blksize);printf("占用块数: %lld 块\n", (long long)st.st_blocks);char timebuf[64];struct tm *tm_info;tm_info = localtime(&st.st_atime);strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S", tm_info);printf("最后访问时间: %s\n", timebuf);tm_info = localtime(&st.st_mtime);strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S", tm_info);printf("最后修改时间: %s\n", timebuf);tm_info = localtime(&st.st_ctime);strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S", tm_info);printf("状态改变时间: %s\n", timebuf);return EXIT_SUCCESS;
}
http://www.dtcms.com/a/312930.html

相关文章:

  • Memcached Slab分配器:零碎片的极速内存管理
  • FFT/STFT/小波/HHT:振动诊断工具生死局,选错=灾难
  • MySQL——增删改查操作
  • Compose笔记(四十一)--ExtendedFloatingActionButton
  • 嵌入式开发学习———Linux环境下IO进程线程学习(二)
  • 【C++】面向对象编程:继承与多态的魅力
  • kafka创建topic报错解决思路之一
  • 日常--详细介绍qt Designer常用快捷键(详细图文)
  • 硅基计划3.0 知识探究 常见类方法
  • 关于Web前端安全防御之安全头配置
  • PHP入门及数据类型
  • 【2025ICCV-目标检测方向】WaveMamba:用于 RGB-红外目标检测的小波驱动曼巴融合
  • 《金字塔原理》读书思考笔记
  • GitOps:云原生时代的革命性基础设施管理范式
  • 关于 xrdp远程桌面报错“Error connecting to sesman on 127.0.0.1:3350“的解决方法
  • Python 基础语法(一):从常量到运算符
  • LeetCode 126:单词接龙 II
  • C语言的基本结构
  • http://localhost:8080/photos/xxx.png的本地图片访问方案
  • 电路原理图绘制专业实战教程2
  • 0803 思维导图+小项目
  • 【Redis学习路|第一篇】初步认识Redis
  • PPT写作五个境界--仅供学习交流使用
  • 构建企业级Web应用:AWS全栈架构深度解析
  • 力扣经典算法篇-39-有效的数独(二维数组和三维数组的应用)
  • AI 编程技巧、技术笔记
  • 安卓调javaScript Not find method “forceLogout“ implementatidsignature or namesp
  • 面向智能体的上下文工程:策略、实现与 LangGraph 实践
  • 基于单片机火灾报警系统/防火防盗系统设计
  • (9)NMPC非线性模型预测控制及机械臂ROS控制器实现