在 ext4 上覆盖小文件是原子的吗?

2023-12-23

假设我们有一个文件FILE_SIZE字节,并且:

  • FILE_SIZE <= min(page_size, physical_block_size);
  • 文件大小永远不会改变(即truncate()或附加write()从未执行过);
  • 仅通过使用以下命令完全覆盖其内容来修改文件:

    
    
    pwrite(fd, buf, FILE_SIZE, 0);
      

是否有保证ext4 that:

  1. 这样的写入相对于并发读取来说是原子的吗?
  2. 此类写入对于系统崩溃而言是事务性的吗?

    (即,崩溃后,文件的内容完全来自先前的写入,我们永远不会看到部分写入或空文件)

第二个是否正确:

  • with data=ordered?
  • with data=journal或者为单个文件启用日志记录?

    (using ioctl(fd, EXT4_IOC_SETFLAGS, EXT4_JOURNAL_DATA_FL))

  • when physical_block_size < FILE_SIZE <= page_size?


我找到了相关问题 https://stackoverflow.com/questions/10650861/atomicity-of-write2-to-a-local-filesystem哪些链接讨论 http://permalink.gmane.org/gmane.comp.file-systems.ext4/27225从 2011 年开始。但是:

  • 我没有找到我的问题的明确答案2.
  • 我想知道,如果以上是真的,是吗?有记录的某处?

从我的实验来看,它不是原子的。

基本上我的实验是有两个进程,一个编写者和一个读者。写入器循环写入文件,读取器从文件读取

编写过程:

char buf[][18] = {
    "xxxxxxxxxxxxxxxx",
    "yyyyyyyyyyyyyyyy"
};
i = 0;
while (1) {
   pwrite(fd, buf[i], 18, 0);
   i = (i + 1) % 2;
}

读者进程

while(1) {
    pread(fd, readbuf, 18, 0);
    //check if readbuf is either buf[0] or buf[1]
}

运行这两个进程一段时间后,我可以看到readbuf或者是xxxxxxxxxxxxxxxxyy or yyyyyyyyyyyyyyyyxx.

所以它明确表明写入不是原子的。就我而言,16 字节写入始终是原子的。

答案是:POSIX 不强制要求除管道之外的写入/读取的原子性。我看到的 16 字节原子性是特定于内核的,并且将来可能会发生变化。

实际帖子中的答案详细信息:Linux 中进程之间的 write(2)/read(2) 原子性 https://stackoverflow.com/questions/35595685/write2-read2-atomicity-between-processes-in-linux

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

在 ext4 上覆盖小文件是原子的吗? 的相关文章

  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • “perf record”或“perf-record”可以对子进程进行采样吗?

    假设我有一个harness二进制文件 它可以根据命令行选项生成不同的基准 我对这些基准测试非常感兴趣 我有3个选择 更改线束二进制文件以生成perf record运行基准测试并进行采样的子进程 just do perf record har
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 树莓派的设备树驱动内核

    我想用设备树驱动的 Linux 内核启动树莓派 有什么特别的事情要做吗 谁能指出为树莓派设置基于设备树的内核启动需要什么 我可能需要有树莓派内核源代码 其中设备驱动程序应与设备树兼容 如果是这样 我在哪里可以找到 Raspberry Pi

随机推荐

  • 使用 python 字典理解进行重构

    我有 2 个字典 其中包含相同的键 但值对不同 让我们让 dictA 和 dictB 代表相关的两个字典 dictA key1 Joe key2 Bob dictB key1 Smith key2 Johnson 目前 我正在通过嵌套 if
  • 如何获取数组包含特定值的子项

    我有一个数据库方案 其本质上是相同的文档 https firebase google com docs database ios structure data fanout An index to track Ada s membershi
  • 在画布上图像的不透明部分周围绘制边框

    我正在使用以下方法在画布上绘制图像drawImage 它是一个被透明像素包围的 PNG 如下所示 如何向画布上该图像的可见部分添加纯色边框 澄清一下 我不想要一个围绕图像边界框的矩形 边界应该围绕草地 我确实考虑过使用阴影 但我并不真正想要
  • 当不带句点的链接方法调用时“不接受参数”

    我有一堂课 class Greeter def hi print hi this def hello print hello this def and this 我想致电new Greeter hi and hello as new Gre
  • npm 发布到 Artifactory 不起作用

    我已经根据此处给出的说明设置了 Artifactory http www jfrog com confluence display RTF Npm Repositories http www jfrog com confluence dis
  • webbrowser iframe 在默认浏览器中打开

    我有 WebBrowser 控件可以在默认浏览器中打开链接 如下所示 private void webBrowser1 Navigating object sender WebBrowserNavigatingEventArgs e if
  • 如何使用 Bazel 构建使用 OpenCV 的项目 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 使用 Bazel 构建使用 OpenCV 库的 C 代码的最佳方法是什么 即 构建规则是什么样的 应该如
  • CSS 使 div 100% 宽度与 body 相关,而不是它的父 div

    I have div style width 500px div style width 100 div div 子 div 占用其父 div 的 100 宽度 有没有一种方法可以强制它采用 100 的 body 宽度而不是父 div 相对
  • ThreadPool 适合这种线程场景吗?

    我有一个场景 如果可能的话 我试图通过在用户实际需要结果之前预获取结果的一些子元素来将其变成响应速度更快的 UI 我不清楚如何最好地处理线程 所以我希望有人可以提供一些建议 Scenario 有一个搜索表单 NET 富客户端 使用户能够为给
  • 创建游程 ID,同时允许游程中存在一定长度的间隙

    我最初发布了一个问题here https stackoverflow com questions 66478148 create a list of vectors from a vector where n consecutive val
  • Protractor - 如何通过自定义(非 HTML)属性定位元素?

    我正在使用 Selenium WebDriver 和 Protractor 在我的 Angular 项目上运行 e2e 测试 假设我有一个像这样的元素 div div 如何找到上面的元素 我尝试过element by css div my
  • 在 PHP 中压缩文件时删除目录结构

    我在 PHP 中压缩文件时遇到了一些问题 我有一个压缩文件数组的函数 这些文件都位于不同的目录中 该函数如下所示 function create zip files array destination overwrite false add
  • 如何使用 pywin32 从 ms 项目中的任务使用情况中提取数据?

    我正在尝试使用 pywin32 Python 库将数据从 MSProject mpp 文件提取到 Excel 文件 我希望我的员工在其中注册他们的工作时间 我可以从任何我想要的字段中提取数据 但任务使用表除外 该表显示每天任务 一个人 X
  • 未捕获的类型错误:Module.cwrap 不是函数

    我需要在浏览器端解码 h264 数据 因为我使用 emscripten 在 Web Assembly 中构建 openh264 库 我已经成功构建它并尝试在 java 脚本中使用它来解码 h264 数据 但我收到以下一行的一个错误 var
  • Sqlite for iOS 是用哪种线程模式编译的?

    这一页http www sqlite org threadsafe html http www sqlite org threadsafe html提到 单线程 多线程 连载 iOS 5中集成的sqlite是用什么模式编译的 好的 所以 s
  • 用于获取 PancakeSwap 上币安智能链代币价格的 API

    我有一个代币的地址 我需要获取它的 BUSD 或 BNB 价格 如果没有其他办法的话 使用付费API是没有问题的 该代币可能不会出现在热门列表中 因此最好直接从 PancakeSwap 获取价格 这是直接从 PancakeSwap 获取的方
  • 隐藏后的CSS无限动画不重置(Chrome)

    这里我有一个 CSS 关键帧动画的例子 你可以在这个演示 http jsfiddle net umbreak q234Lsx8 1 该代码每 1 4 秒就会将 img 缩放到 0 75 然后返回到其原始 1 比例 效果很好 然后我添加一个简
  • 如何使用 CSS 动画更改 CSS 动画中的字体颜色

    我正在努力做到这一点 以便当我打开页面时 test将显示为红色并且testing将显示为白色 当页面打开时 我要保留一个延迟 如果您运行该程序 您将看到 Css hero h1 display block width fit content
  • iOS 蓝牙后台模式

    我希望继续扫描蓝牙设备 并且希望应用程序在后台运行 是否可以 似乎如果我有一个连接的蓝牙设备 并且有数据传输 那么该应用程序就会在后台保持唤醒状态 但是 如果我只是在后台扫描 似乎即使我有Uses Bluetooth LE accessor
  • 在 ext4 上覆盖小文件是原子的吗?

    假设我们有一个文件FILE SIZE字节 并且 FILE SIZE lt min page size physical block size 文件大小永远不会改变 即truncate 或附加write 从未执行过 仅通过使用以下命令完全覆盖