标准是否要求重命名是原子的?

2024-04-01

当我试图回答这个问题时,出现了一个有趣的问题:

mv 在我的 fs 上是原子的吗? https://unix.stackexchange.com/questions/322038/is-mv-atomic-on-my-fs/322074#322074

Is the rename()功能required按照标准是原子的?

的“理由”部分POSIX 标准rename http://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html states:

This rename()功能与常规文件等效 由 ISO C 标准定义。它包含在这里扩展了 定义包括对目录的操作并指定行为 当新参数命名一个已经存在的文件时。那 规范要求函数的操作是原子的。

但是,最新公开的 ISO C 标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf部分关于rename全文指出:

7.21.4.2rename功能

Synopsis

#include <stdio.h>
int rename(const char *old, const char *new);

描述

The rename函数导致文件名是由 指向的字符串old从此以后以这个名字为人所知 由指向的字符串给出new。该文件名为old没有 可以通过该名称更方便地访问。如果由指向的字符串命名的文件 到通过new在调用之前存在rename函数,则 行为是实现定义的。

Returns

The rename如果操作成功则函数返回零,如果失败则返回非零,在这种情况下如果文件存在 此前,它仍以其原始名称而闻名。

对于任何类型的原子性都没有任何类型的明确要求rename()ISO C 标准的部分。

编写了许多依赖于明显特定于实现的原子性的程序rename(),我原以为原子性是一项要求,但对 C 标准中的缺乏感到惊讶。

但POSIX标准说ISO C标准要求rename()成为原子的。

解释?


您对 POSIX 标准的引用rename() http://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html来自(非规范性)“基本原理”部分。主条目——实际的规范材料——开始于:

For rename(): [CX] [Option Start] The functionality described on this reference page is aligned with the ISO C standard. Any conflict between the requirements described here and the ISO C standard is unintentional. This volume of POSIX.1-2008 defers to the ISO C standard. [Option End]

The rename() function shall change the name of a file. The old argument points to the pathname of the file to be renamed. The new argument points to the new pathname of the file. [CX] [Option Start] If the new argument does not resolve to an existing directory entry for a file of type directory and the new argument contains at least one non-<slash> character and ends with one or more trailing <slash> characters after all symbolic links have been processed, rename() shall fail.

[Option End]

所有其余的条目都在[CX](C 扩展)标签并讨论其他特殊行为。

你引用的理由是:

This rename()常规文件的功能与 ISO C 标准定义的功能等效。此处的包含扩展了该定义,以包括对目录的操作,并指定新参数命名已存在的文件时的行为。该规范要求函数的操作是原子的。

最后一句中提到的“该规范”是扩展定义,其中包括对目录的操作规范和“当新参数命名已存在的文件时”,而不是 C 标准中的规范,正如您所观察到的,没有提及任何关于原子性的内容(非常合理;有可以支持 C 和rename()无法支持 POSIX 更严格的原子性要求)。

我发现这正是T.C https://stackoverflow.com/users/2756719/t-c在他们的comment https://stackoverflow.com/questions/40538241/is-rename-required-by-standard-to-be-atomic#comment68316147_40538241— 我同意 T.C.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标准是否要求重命名是原子的? 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 如何在混合移动应用程序中实施 Google Analytics?

    我正在使用 HTML5 CSS 和 jQuery Mobile 编写一个混合移动应用程序 我将使用 Cordova Js 将 HTML5 应用程序转换为适用于 iOS 和 Android 的本机移动应用程序 我想使用 Google Anal
  • vim 有 C++11 语法文件吗?

    特别是初始化列表的显示非常糟糕 vector
  • 为什么 vue v-model 不适用于数组 prop?

    我有一个自定义组件 它采用modelValue道具并发出update modelValue事件 在父组件中 我传递一个数组 测试组件 vue
  • Azure 服务总线“发送”抛出由于对象的当前状态而导致操作无效

    我不确定发生了什么变化 但突然我得到一个 InvalidOperationException 由于对象的当前状态 操作无效 我的代码以前确实有效 但我不记得更改过任何内容 我正在使用 Microsoft Azure ServiceBus 4
  • 创建 d3.js SVG 文本元素后获取其宽度

    我正在尝试获取一堆的宽度text我用 d3 js 创建的元素 这就是我创建它们的方式 var nodesText svg selectAll text data dataset enter append text text function
  • 如何在会话中运行多个图 - Tensorflow API

    张量流API https github com tensorflow models tree master research object detection提供了一些预先训练的模型 并允许我们使用任何数据集来训练它们 我想知道如何在一个张
  • 在 Pydroid 3 终端中安装 Git

    我正在使用 Pydroid3 并且想在 Pydroid 终端中使用 Git 在我的 Termux 终端中 我能够按照此处所述安装 Git git 命令现在只能在 Termux 终端中识别 但不能在 Pydroid 中识别 无法在 Pydro
  • Keras/Tensorflow 中涉及梯度的自定义损失函数

    我发现这个问题之前已经被问过几次了 但没有任何解决方案 我的问题很简单 我想实现一个损失函数 它计算预测梯度和真值之间的 MSE 最终转向更复杂的损失函数 我定义了以下两个函数 def my loss y true y pred x dyd
  • 自定义警报对话框边框

    我正在创建一个自定义对话框 其示例代码为 final AlertDialog dialog protected AlertDialog createDialog int dialogId AlertDialog Builder builde
  • 如何设计深度卷积神经网络? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 据我了解 所有 CNN 都非常相似 它们都有一个卷积层 后面是池化层和 relu 层 有些具有专门的层 例如 FlowNet 和 Segn
  • Iphone 迭代 NSString 的子字符串出现次数

    我想找到 NSString 中所有出现的子字符串 并逐一迭代以对该 NSString 进行一些更改 我该怎么做呢 怎么样 find first occurrence of search string in source string NSR
  • Angular2 模块级样式表

    我正在使用模块化结构设计我的网站sass questions tagged sass我愿意以这样的方式组织样式表 在每个模块级别 而不是组件级别 定义样式表 然后将其导入所有组件中以保持整个模块的标准布局 那么这是一个好方法吗 如果是的话
  • 如何使用 distutils 和/或 setuptools 在 mac os x 上创建 .dylib C 扩展?

    我需要使用 distutils 和 或 setuptools 创建一个 C 扩展 它可以在运行时和编译时动态使用 用于不同的目的 这在 Linux 上不是问题 但在 OS X 上却是问题 默认情况下 distutils 在 OS X 上创建
  • mongodb 字段以 $ 开头的奇怪行为

    在这个帖子上MongoDB 查找嵌套元素 https stackoverflow com questions 8983482 mongodb finding nested elements 作者声称 mongodb 文档结构是 car re
  • 本地 Dask 工作线程无法连接到本地调度程序

    在 OSX 10 12 6 上运行 Dask 0 16 0 时 我无法连接本地dask worker给当地人dask scheduler 我只是想关注官方达斯克教程 https github com dask dask tutorial b
  • rpart - 查找修剪树的 cp 值将返回的叶子数量

    我有一个要求 需要根据分类变量 具有超过 5 个类别值 与连续变量的关联将其分为 5 组 为了实现这一目标 我正在使用rpart with annova 方法 例如我的分类变量是type有代码1 2 3 4 5 6 7 8 9 10 11
  • ReferenceError:令牌未定义

    我一直在关注使用 ionic 进行身份验证的登录教程 但是当我尝试运行该程序并登录时 错误是 ReferenceError 令牌未定义 在 storeUserCredentials services js 16 在 services js
  • 使用 ASP.NET 进行卷曲请求

    我已经阅读了 Stack 上的其他一些帖子 但我无法让它工作 当我在Windows机器上的git中运行curl命令时 它在我的电脑上工作正常 但是当我将其转换为asp net时 它不起作用 private void BeeBoleReque
  • 如何识别您正在虚拟机下运行?

    有没有办法从虚拟机内识别您的代码正在虚拟机内运行 我想有或多或少简单的方法来识别特定的虚拟机系统 特别是如果虚拟机安装了提供商的扩展 例如 VirtualBox 或 VMWare 但是有没有一个通用的方法来识别你不是直接在CPU上运行的呢
  • 标准是否要求重命名是原子的?

    当我试图回答这个问题时 出现了一个有趣的问题 mv 在我的 fs 上是原子的吗 https unix stackexchange com questions 322038 is mv atomic on my fs 322074 32207