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 一款专业的视频字幕制作和视频处理工具
相关推荐
A-刘晨阳1 天前
AI原生时序数据库选型指南:从数据存储到智能决策的范式跃迁HalvmånEver1 天前
MySQL的增删改查命令合集合集不剪发的Tony老师1 天前
dblab:一款基于终端的交互式数据库客户端YJlio1 天前
7.4.5 Windows 11 企业网络连接与网络重置实战:远程访问、本地策略与故障恢复深耕AI1 天前
【VS Code避坑指南】点击Python图标提示“没有Python环境”,选择安装uv后这堆输出到底是什么意思?第一程序员1 天前
Rust生命周期管理实战指南:从困惑到掌握程序员威哥1 天前
实战!Python爬京东商品评论:从采集到情感分析+词云可视化,新手30分钟跑通风噪1 天前
centos7 python3.13全套安装(可用于离线复制)xwz小王子1 天前
Science Robotics基础模型正在改写机器人集群的“游戏规则”茉莉玫瑰花茶1 天前
LangGraph 介绍