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 一款专业的视频字幕制作和视频处理工具
相关推荐
qq_330037992 小时前
如何转换数据文件字节序_CONVERT DATAFILE用于跨OS平台数据库迁移白日梦想家6812 小时前
博客二:递归实战避坑指南,从入门到熟练运用djjdjdjdjjdj2 小时前
SQL窗口函数解决多维排名问题_组合排序实战AC赳赳老秦2 小时前
OpenClaw与系统环境冲突:Windows/Mac系统兼容问题解决指南小张同学8242 小时前
Python 封神技巧:1 行代码搞定 90% 日常数据处理,效率直接拉满吕源林2 小时前
Laravel Blade 中高效筛选并限制关联分类数据的正确实践qq_424098562 小时前
PHP怎么安全生成随机数_random_int替代mt_rand说明【说明】Captain_Data2 小时前
SQL优化实战:如何让查询速度提升10倍源码之家2 小时前
计算机毕业设计:Python棉花产业数据可视化与预测系统 Django框架 ARIMA算法 数据分析 可视化 爬虫 大数据 大模型(建议收藏)✅