c - 当两个或多个线程或进程 ftruncate(2) 同一个文件时会发生什么?
问题描述
据我了解,ftruncate(2)
当我将文件扩展至 2 GB 长度时,它不能是原子的。
但幕后究竟发生了什么?我已经应用了它,当多个线程扩展文件时它似乎工作正常,但我不确定它是否不会导致任何数据丢失。
另外,假设有 2 个线程ftruncate(2)
同时调用,第一个线程正在将文件扩展至 2 GB。同时第二个线程调用ftruncate(2)
. 现在的疑问是第一个线程没有完成完整的工作,第二个线程也开始了 ftruncate,那么会发生什么?
另外,如果这会引起任何麻烦,那么使用文件锁是一个明智的解决方案吗?我正在编写的这段代码是一个库,所以当使用该库时,我不会知道正在使用该库的进程的状态和配置。在这种情况下是否有可能出现死锁?
解决方案
ftruncate(2)
就我过去观察到的情况而言,很好地回答我的这个老问题。
在评论中,@BearAqua 分享了一个在 macOS 上运行不正常的链接ftruncate(2)
,POSIX shared memory
但这对常规文件无效。
尽管据我所知,我在任何地方都找不到它记录ftruncate(2)
的原子或类似原因,但是的,就我所测试的而言,它是原子的。
推荐阅读
- c# - 为什么方法组会导致堆分配?
- node.js - Nodejs Paypal 支付 SDK 格式错误的 JSON 错误
- node.js - Sequelize - 同步多对多
- c# - 解析从流加载的 libvlcsharp 视频不起作用
- c++ - 如何解决这两个错误?'strlwr' - '但参数 2 的类型为 'int''
- symfony - Symfony:如何在编辑功能上检查控制器中的多种字符串类型
- android - 错误:ADB 以退出代码 1 退出 启动应用程序时出错
- python - 是否有特定的方法可以在 python 中的某个时间打开 Web 链接?
- database - '在 SQL 语句结束后找到的字符。'
- python - 在 macOS 11.0 Big Sur 上安装 Pyobjc 时出错