当前位置:  开发笔记 > 编程语言 > 正文

如何针对外部进程锁定文件

如何解决《如何针对外部进程锁定文件》经验,为你挑选了1个好方法。

我需要创建一个无法被其他脚本或进程删除的锁定文件.我试过这个:

    $f = fopen($pidFile, 'w');
    fwrite($f, getmypid());
    flock($f, LOCK_EX);

但是,从当前用户启动的任何其他进程都可以删除该$f文件,即使正在运行的脚本仍然打开了文件句柄.如何解决这个问题并防止其他人(即非PHP进程)删除文件?当进程退出时,锁会自动释放吗?所有类似的问题都以RTM flock()结束,但它们都没有回答如何针对外部进程锁定文件.

操作系统是 Linux 2.6.32-431.el6.x86_64



1> Gordon..:

flock在Linux上默认使用"顾问锁定",这意味着它不会阻止任何其他进程操纵该文件.请参阅PHP手册中的注释.

flock()在Windows上使用强制锁定而不是建议锁定.通过fcntl()系统调用支持的常用机制,基于Linux和System V的操作系统也支持强制锁定:即,如果相关文件设置了setgid权限位且组执行位已清除.在Linux上,还需要使用mand选项挂载文件系统,以使其正常工作.

另请参阅https://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt

通过在文件模式下设置group-id位但删除group-execute位,将文件标记为强制锁定的候选者.这是一个无意义的组​​合,由System V实现者选择,以便不破坏现有的用户程序.

请注意,在写入setgid文件时,内核通常会自动清除group-id位.这是一项安全措施.已修改内核以识别强制锁定候选的特殊情况并避免清除此位.类似地,内核已被修改为不运行具有setgid权限的强制锁候选.

还要注意警告:

甚至根也不能覆盖强制锁定,因此如果锁定关键文件,失控进程可能会造成严重破坏.解决它的方法是在尝试读取或写入之前更改文件权限(删除setgid位).

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有