Windows用CreateFileLockFileEx实现跨进程文件锁需设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 或自己 forkexec 启子进程处理日志结果子进程一退出触发 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 一款专业的视频字幕制作和视频处理工具