os.open() 在哪些系统/文件系统上是原子的?

2023-11-23

This文章指出,

fd = os.open('foo.lock', os.O_CREAT|os.O_EXCL|os.O_RDWR)

“在大多数文件系统上是原子的”。这是真的吗(在 Unix 和 Windows 上)?在哪些文件系统上?

The docs声明提到的标志在 Unix 和 Windows 上可用,因此它看起来像是一种诱人的跨平台文件锁定方法(标志O_CREAT and O_EXCL确保调用进程创建该文件)。


对于符合 UN*X 标准(根据 OpenGroup 经过认证的 POSIX / IEEE 1003.1)系统,该行为按照 OpenGroups 规范得到保证open(2) mandate这。引用:

O_EXCL
如果设置了 O_CREAT 和 O_EXCL,则当文件存在时 open() 将失败。检查文件是否存在,如果不存在则创建文件atomic相对于执行 open() 的其他线程,在同一目录中使用 O_EXCL 和 O_CREAT 设置命名相同的文件名。如果设置了 O_EXCL 和 O_CREAT,并且路径名为符号链接,则 open() 将失败并将 errno 设置为 [EEXIST],无论符号链接的内容如何。如果设置了 O_EXCL 而未设置 O_CREAT,则结果未定义。

“常见”UN*X 和类 UN*X 系统(Linux、MacOSX、*BSD、Solaris、AIX、HP/UX)的行为肯定是这样的。

由于 Windows API 没有open()因此,库函数必须根据本机 API 重新实现,但可以保持语义。

不知道哪些系统被广泛使用wouldn't遵守; QNX 虽然没有经过 POSIX 认证,但在其文档中也有相同的声明:open()。 *BSD 手册页没有明确提及“原子性”,但 Free/Net/OpenBSD 实现了它。甚至像 SymbianOS 这样的外来操作系统(它像 Windows 一样没有 UN*X 风格)open系统调用)可以进行原子打开/创建。

要获得更有趣的结果,请尝试查找具有以下功能的操作系统/C 运行时库open() but doesn't为它实现上述语义......并且Python将在其上运行线程(明白了,MSDOS ...)。

Edit:我的帖子特别关注“哪些操作系统具有此特征”open?” - 答案是“几乎所有”。Wrt. to文件系统不过,情况有所不同,因为网络文件系统- 无论是 NFS、SMB/CIFS 还是其他,并不总是维护O_EXCL因为这可能会导致拒绝服务(如果客户端执行open(..., O_EXCL, ...)然后停止与文件服务器通信/关闭,其他人都将被锁定)。

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

os.open() 在哪些系统/文件系统上是原子的? 的相关文章

  • 在 Python 中将列表元素作为单独的项目返回

    Stackoverflow 的朋友们大家好 我有一个计算列表的函数 我想单独返回列表的每个元素 如下所示 接收此返回的函数旨在处理未定义数量的参数 def foo my list 1 2 3 4 return 1 2 3 4 列表中的元素数
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • 如何从Python中的函数返回多个值? [复制]

    这个问题在这里已经有答案了 如何从Python中的函数返回多个变量 您可以用逗号分隔要返回的值 def get name you code return first name last name 逗号表示它是一个元组 因此您可以用括号将值括
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • Windows 上最快的屏幕捕获方法

    我想为Windows平台编写一个截屏程序 但不确定如何捕获屏幕 我知道的唯一方法是使用 GDI 但我很好奇是否还有其他方法可以实现此目的 如果有的话 哪种方法产生的开销最小 速度是首要任务 截屏程序将用于录制游戏镜头 不过 如果这确实缩小了
  • 无法导入 langchain.agents.load_tools

    我正在尝试使用 LangChain Agents 但无法导入 load tools 版本 langchain 0 0 27 我尝试过这些 from langchain agents import initialize agent from
  • 通过Python连接到Bigquery:ProjectId和DatasetId必须非空

    我编写了以下脚本来通过 SDK 将 Big Query 连接到 Python 如下所示 from google cloud import bigquery client bigquery Client project My First Pr
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • Spider 必须返回 Request、BaseItem、dict 或 None,已“设置”

    我正在尝试从以下位置下载所有产品的图像 我的蜘蛛看起来像 from shopclues items import ImgData import scrapy class multipleImages scrapy Spider name m
  • PySpark groupByKey 返回 pyspark.resultiterable.ResultIterable

    我试图找出为什么我的 groupByKey 返回以下内容 0
  • 如何使用 AWS Lambda Python 读取 AWS S3 存储的 Word 文档(.doc 和 .docx)文件内容?

    我的场景是 我尝试使用 python 实现从 Aws Lambda 读取 AWS 存储的 S3 word 文档 doc 和 docx 文件内容 下面的代码是我使用的 我的问题是我可以获取文件名 但无法读取内容 def lambda hand
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 根据 Pandas 中的列表选择数据框行的子集

    我有一个数据框df1并列出x In 22 import pandas as pd In 23 df1 pd DataFrame C range 5 B range 10 20 2 A list abcde In 24 df1 Out 24
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐