Windows用CreateFile+LockFileEx实现跨进程文件锁,需设FILE_SHARE_NONE并调用LockFileEx锁字节范围;Linux/macOS用flock轻量但需防fork继承问题;fcntl更通用但易因多fd误判锁状态;跨平台封装须注意链接、unlink及句柄管理差异。Windows 下用 CreateFile + LockFileEx 做跨进程文件锁Windows 没有 POSIX 风格的 flock,得靠 Win32 API 手动控制。核心是打开文件时加 FILE_SHARE_NONE(或按需设共享标志),再用 LockFileEx 锁具体字节范围------哪怕只锁 1 字节,也能阻塞其他进程对同一区域的读写。常见错误是只调 CreateFile 却不调 LockFileEx,以为句柄独占就等于文件被锁;实际其他进程仍可另开句柄操作文件(尤其当共享标志没关死)。CreateFile 的 dwShareMode 必须设为 0(即 FILE_SHARE_NONE),否则锁无效LockFileEx 的 dwFlags 推荐用 LOCKFILE_EXCLUSIVE_LOCK,避免误读共享锁逻辑锁是字节范围的,lpOverlapped 中的 Offset 和 OffsetHigh 要配对设置,超 4GB 文件必须填 OffsetHigh锁在句柄关闭或进程退出时自动释放,但别依赖这点------显式调 UnlockFileEx 更可控Linux/macOS 用 flock 最简但要注意 fork 行为flock 是最轻量的跨进程文件锁,基于文件描述符,父子进程默认继承锁状态。问题就出在这:fork 后子进程拥有同一 fd,锁也跟着继承,exec 不会丢锁,但 close 会释放锁------哪怕只是子进程 close,父进程的锁也没了。典型翻车场景:用 popen 或自己 fork+exec 启子进程处理日志,结果子进程一退出(触发 fd 关闭),主进程的锁就意外释放。立即学习"C++免费学习笔记(深入)";用 flock(fd, LOCK_EX | LOCK_NB) 加非阻塞锁,失败时立刻报错,别卡住若需 fork 后保持锁,父进程应在 fork 前 dup 一次 fd,子进程用 dup 出的 fd,父进程保留原 fdflock 锁的是整个文件,不支持字节范围;要精细控制请换 fcntl + F_SETLK注意 flock 在 NFS 上可能不可靠,生产环境涉及网络文件系统时优先考虑 fcntlfcntl 的 F_SETLK 为什么更通用但更难写对fcntl 是 POSIX 标准锁,支持字节范围、共享/独占、阻塞/非阻塞,且 NFS 友好。但它要求先用 open 打开文件(不能用 freopen 或 stdio FILE*),且锁状态与 fd 强绑定------每个 fd 独立持锁,不存在"文件级"概念。 Zeemo AI 一款专业的视频字幕制作和视频处理工具
相关推荐
学测绘的小杨6 小时前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包ClouGence12 小时前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因zzzzzz31013 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南雪隐13 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!飞将14 小时前
从零实现数据库(2)——HashIndex + IndexManager兵慌码乱1 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现hboot1 天前
AI工程师第三课 - 机器学习基础顾林海1 天前
Agent入门阶段-编程基础-Python:流程控制呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的Nturmoils1 天前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT