C程序获取inode信息与文件创建日期时出现段错误,求修复
修复C程序段错误并正确获取inode和文件时间信息
你的程序出现段错误主要是因为缺少必要的参数与调用结果检查,以及内存分配后的有效性验证,以下是具体问题分析和修复方案:
问题根源
- 未检查命令行参数:当启动程序时未传入文件路径参数,
argv[1]为NULL,调用stat会触发非法内存访问,直接导致段错误。 - 未验证
malloc返回值:如果内存分配失败,buffer会是NULL,此时访问buffer->st_ctime必然触发段错误。 - 未检查
stat调用结果:如果stat调用失败(比如文件不存在、权限不足),buffer内的成员处于未初始化状态,访问这些成员会引发未定义行为(包括段错误)。 - 额外说明:在Linux系统中,
st_ctime表示文件状态最后改变的时间,而非文件创建时间;如果需要真正的创建时间,Linux内核3.10+支持st_birthtime(需启用GNU扩展)。
修复后的代码(满足ctime使用要求)
#include <sys/stat.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char * argv[]) { // 检查命令行参数数量是否正确 if (argc != 2) { fprintf(stderr, "用法: %s <文件或目录路径>\n", argv[0]); exit(EXIT_FAILURE); } struct stat *buffer = malloc(sizeof(struct stat)); // 检查内存分配是否成功 if (buffer == NULL) { perror("malloc 失败"); exit(EXIT_FAILURE); } // 检查stat调用是否成功 if (stat(argv[1], buffer) == -1) { perror("stat 调用失败"); free(buffer); // 释放已分配的内存,避免泄漏 exit(EXIT_FAILURE); } // 注意:Linux下st_ctime是状态改变时间,不是创建时间 printf("文件状态最后改变时间: %s", ctime(&buffer->st_ctime)); printf("inode编号: %ld\n", buffer->st_ino); free(buffer); // 释放内存,避免内存泄漏 return 0; }
若需获取文件创建时间(Linux环境)
如果确实需要获取文件的创建时间,可以启用GNU扩展使用st_birthtime,代码如下:
#define _GNU_SOURCE // 启用GNU扩展特性 #include <sys/stat.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char * argv[]) { if (argc != 2) { fprintf(stderr, "用法: %s <文件或目录路径>\n", argv[0]); exit(EXIT_FAILURE); } struct stat *buffer = malloc(sizeof(struct stat)); if (buffer == NULL) { perror("malloc 失败"); exit(EXIT_FAILURE); } if (stat(argv[1], buffer) == -1) { perror("stat 调用失败"); free(buffer); exit(EXIT_FAILURE); } printf("文件创建时间: %s", ctime(&buffer->st_birthtime)); printf("inode编号: %ld\n", buffer->st_ino); free(buffer); return 0; }
内容的提问来源于stack exchange,提问作者rihness
相关产品推荐
相关产品推荐

