当前位置: 首页 > 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.lryc.cn/news/608967.html

相关文章:

  • Web前端文件上传安全与敏感数据安全处理
  • HiveMQ核心架构思维导图2024.9(Community Edition)
  • 反向代理+网关部署架构
  • 动态置信度调优实战:YOLOv11多目标追踪精度跃迁方案(附完整代码)
  • 关于corn
  • Android 之 图片加载(Fresco/Picasso/Glide)
  • 禁闭求生2 免安 中文 离线运行版
  • 【数据结构与算法】数据结构初阶:排序内容加餐(二)——文件归并排序思路详解(附代码实现)
  • 【LeetCode 热题 100】84. 柱状图中最大的矩形——(解法一)单调栈+三次遍历
  • 二叉树的锯齿形层次遍历
  • 9.苹果ios逆向-FridaHook-ios中的算法(CCCrypt)
  • CCF-GESP 等级考试 2025年6月认证C++一级真题解析
  • wordpress登陆前登陆后显示不同的顶部菜单
  • 最简单的零基础软件测试学习路线
  • Libevent(5)之使用教程(4)工具
  • k8s黑马教程笔记
  • 快速搭建一个非生产k8s环境
  • 【运维基础】Linux 硬盘分区管理
  • k8s+isulad 国产化技术栈云原生技术栈搭建4-添加worker节点
  • Hyper-V + Centos stream 9 搭建K8s集群(二)
  • k8s+isulad 国产化技术栈云原生技术栈搭建3-master节点安装
  • [硬件电路-148]:数字电路 - 什么是CMOS电平、TTL电平?还有哪些其他电平标准?发展历史?
  • Go语言实战案例:TCP服务器与客户端通信
  • 案例介绍|JSON数据格式的转换|pyecharts模块简介
  • Kafka——怎么重设消费者组位移?
  • 构建企业级Web应用:AWS全栈架构深度解析
  • AtCoder Beginner Contest 417
  • [硬件电路-147]:模拟电路 - DC/DC电压的三种架构:升压(Boost)、降压(Buck)或升降压(Buck-Boost)
  • 跨语言模型中的翻译任务:XLM-RoBERTa在翻译任务中的应用
  • 界面规范4-按钮