想保证同一时刻只有一个进程在改某个文件,怎么办?这篇用标准库自带的文件锁 API,在真实的多进程场景下验证独占与共享、阻塞与非阻塞、崩溃后的释放,以及「建议性」到底意味着什么。
try_lock(独占):WouldBlock(被别人持有) try_lock_shared(共享):WouldBlock(被别人持有) lock(独占)阻塞了约 600 ms 才拿到(持有者睡 600 ms 后退出,实际等待 604 ms)
文件基础见std::fs 文件读写;子进程见子进程与 Command。
try_lock_shared(共享):拿到 try_lock(独占):WouldBlock(被别人持有)
持有者运行中:try_lock(独占):WouldBlock(被别人持有) kill -9 持有者之后:try_lock(独占):拿到
持有独占锁期间,另一个进程 没有加锁直接写文件:成功(锁是建议性的) 文件内容:'written without taking the lock'
句柄 a 拿到独占锁 同一进程里的句柄 b try_lock:WouldBlock 句柄 a 再 try_lock 一次(已经持有):成功(幂等) a.unlock() 之后 b try_lock:拿到 b 被 drop(关闭文件)时锁也随之释放:再开一个句柄 c 能拿到锁:true
文件描述符的释放见文件描述符与资源释放。