gpt4 book ai didi

C 跨平台 renameat2() 重命名如果不存在的功能

转载 作者:太空宇宙 更新时间:2023-11-03 23:20:17 33 4
gpt4 key购买 nike

是否有一种非特定于平台的方式来执行原子操作“如果 File2 不存在,则将 File1 重命名为 File2,否则给出错误”?我知道我可以只检查 File2 是否存在,如果不存在则重命名文件,但是当其他进程在检查和 rename() 之间创建 File2 时,这会引入潜在的竞争条件。

在 Linux 下,有一个 renameat2() 函数,它通过设置 RENAME_NOREPLACE 标志来执行此操作。不幸的是,联机帮助页说

renameat2() is Linux-specific.

我什至不知道是所有的 libc 实现都支持这个调用,还是只支持 glibc。

对于我的用例,在同一目录内重命名就足够了,我不需要支持移动到完全不同的路径。

这可能与 https://stackoverflow.com/a/230581/5562035 有关和 Atomically swap contents of two files on Linux

最佳答案

Is there a non-platform-specific way of doing an atomic "rename File1 to File2 if File2 does not exist, otherwise give an error"?

C 标准库只提供rename()用于更改文件名,标准对该函数进行了说明:“如果在调用 rename 函数之前存在由 new 指向的字符串命名的文件,行为是实现定义的。”因此,如果“non-platform-specific”被解释为“C standard specified”那么不,不存在这样的机制。

如果我们扩大“非平台特定”的范围以允许 POSIX 指定的设施,那么您可以依赖 link() , 哪个

shall atomically create a new link for the existing file and the link count of the file shall be incremented by one. [and] shall fail if [... the second argument] resolves to an existing directory entry or refers to a symbolic link.

因此,您可以先创建一个新的(硬)链接到该文件,如果指定的路径名​​指定一个现有文件或符号链接(symbolic link)则失败,然后在成功时删除原始链接。

您可能感兴趣的最著名的非 POSIX 平台是 Windows。我不确定是否有任何方法可以完成您在 Windows 上的要求,但如果有,您可以考虑编写一个包装函数,该函数使用条件编译来选择 POSIX 或 Windows 实现。

关于C 跨平台 renameat2() 重命名如果不存在的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41536199/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com