You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用系统编程创建拥有相同访问时间和权限的文件foo与foo2

问题分析

你现有代码的核心问题如下:

  • 调用open()时仅传入了O_RDWR标志,没有新增O_CREAT参数,因此不会主动创建不存在的文件,必须提前手动创建才能打开成功
  • 没有对两个文件的权限、时间元数据做同步逻辑,自然无法保证二者属性一致
正确实现方案

实现逻辑如下:

  1. 先创建并打开第一个文件foo,指定初始权限
  2. 通过fstat()系统调用读取foo的所有元数据,包含权限位、访问时间、修改时间
  3. 用读取到的权限作为参数创建第二个文件foo2
  4. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:54:00