当两个或多个线程或进程ftruncate(2)相同文件时会发生什么?

时间:2019-05-14 13:42:56

标签: c file posix race-condition libc

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

但是幕后到底发生了什么?我已经应用了它,当有多个线程扩展该文件时,它似乎可以正常工作,但是我不确定它是否不会造成任何数据丢失。

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

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

1 个答案:

答案 0 :(得分:0)

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

@BearAqua在评论中分享了ftruncate(2)POSIX shared memory在MacOS上功能不正常的链接,但这不适用于常规文件。

尽管据我所知,在ftruncate(2)是原子性或类似原因的任何地方都找不到文档,但是据我测试,它是原子性的。