使用系统编程创建拥有相同访问时间和权限的文件foo与foo2
问题分析
你现有代码的核心问题如下:
- 调用
open()时仅传入了O_RDWR标志,没有新增O_CREAT参数,因此不会主动创建不存在的文件,必须提前手动创建才能打开成功 - 没有对两个文件的权限、时间元数据做同步逻辑,自然无法保证二者属性一致
正确实现方案
实现逻辑如下:
- 先创建并打开第一个文件
foo,指定初始权限 - 通过
fstat()系统调用读取foo的所有元数据,包含权限位、访问时间、修改时间 - 用读取到的权限作为参数创建第二个文件
foo2 - 调用
futimens()将foo2的访问时间、修改时间同步为和foo完全相同
完整可运行代码如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <time.h> #include <errno.h> int main() { // 第一步:创建并打开foo,权限初始设为0644,可根据需要修改 // 不需要覆盖已有文件可删除O_TRUNC标志 int fd_foo = open("./foo", O_RDWR | O_CREAT | O_TRUNC, 0644); if (fd_foo == -1) { perror("创建foo失败"); exit(EXIT_FAILURE); } // 第二步:获取foo的元数据 struct stat foo_stat; if (fstat(fd_foo, &foo_stat) == -1) { perror("读取foo元数据失败"); close(fd_foo); exit(EXIT_FAILURE); } // 第三步:用foo的权限创建foo2 // 掩码07777用于过滤st_mode中的非权限位,仅保留读写执行、SUID、SGID、粘滞位属性 int fd_foo2 = open("./foo2", O_RDWR | O_CREAT | O_TRUNC, foo_stat.st_mode & 07777); if (fd_foo2 == -1) { perror("创建foo2失败"); close(fd_foo); exit(EXIT_FAILURE); } // 第四步:同步访问时间、修改时间 struct timespec times[2]; times[0] = foo_stat.st_atim; // 访问时间 times[1] = foo_stat.st_mtim; // 修改时间 if (futimens(fd_foo2, times) == -1) { perror("同步时间失败"); close(fd_foo); close(fd_foo2); exit(EXIT_FAILURE); } printf("文件创建及属性同步完成\n"); printf("foo 文件描述符:%d\n", fd_foo); printf("foo2 文件描述符:%d\n", fd_foo2); // 关闭文件描述符避免资源泄漏 close(fd_foo); close(fd_foo2); return 0; }
验证方法
编译运行代码后,可以执行以下命令查看两个文件的属性是否一致:stat foo foo2
输出中的Access(访问权限)、Access Time、Modify Time字段应该完全相同。
内容的提问来源于stack exchange,提问作者user14661106
相关产品推荐
相关产品推荐

