【问题标题】:What happens when two or more threads or processes ftruncate(2) the same file?当两个或多个线程或进程 ftruncate(2) 同一个文件时会发生什么?
【发布时间】:2019-05-14 13:42:56
【问题描述】:

据我了解,ftruncate(2) 在我将文件扩展至 2 GB 长度时不能是原子的。

但幕后究竟发生了什么?我已经应用了它,当多个线程扩展文件时它似乎工作正常,但我不确定它是否不会导致任何数据丢失。

另外,假设有 2 个线程同时调用ftruncate(2),第一个线程正在将文件扩展至 2 GB。同时第二个线程调用ftruncate(2)。现在的疑问是第一个线程没有完成完整的工作,第二个线程也开始了 ftruncate,那么会发生什么?

另外,如果这会引起任何麻烦,那么使用文件锁是一个明智的解决方案吗?我正在编写的这段代码是一个库,所以当使用该库时,我不会知道正在使用该库的进程的状态和配置。在这种情况下是否有可能出现死锁?

【问题讨论】:

  • 您为什么怀疑对ftruncate() 的调用是非原子的?我想,确实是这样。
  • 你用的是什么系统?在 macOS 上,ftruncate 的行为可能会有所不同:stackoverflow.com/questions/25502229/…
  • @BearAqua 此 q/a 仅指在 posix 共享内存段上的 ftruncate,而不是在常规文件上。
  • @Ctx 但它确实表明某些ftruncate 行为是系统相关的。
  • @Ctx 感谢您提供的信息。我在想,因为我将它截断为 2GB 长度,所以它可能不是原子的。

标签: c file posix race-condition libc


【解决方案1】:

很好地回答了我的这个老问题,就我过去观察到的而言,ftruncate(2) 是原子的。

在 cmets 中,@BearAqua 在 macOS 上分享了 ftruncate(2)POSIX shared memory 功能不正常的链接,但这对常规文件无效。

虽然据我记得我在任何地方都找不到它记录 ftruncate(2) 是原子的或类似的原因,但是的,就我所测试的而言它是原子的。

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 2022-11-26
    • 2014-03-18
    • 1970-01-01
    • 2014-10-18
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多