看来当php使用flock()获取文件的独占锁,然后使用pcntl_fork分成两个进程时,两个进程都有相同的独占锁 - 也就是说,进一步调用flock($该文件句柄上的fd,LOCK_EX)返回true。
但是,使用flock的目的是防止两个进程同时写入同一个文件。那么PHP如何处理这种情况呢?它是否允许两个进程(它们都有独占锁)发生冲突?有没有办法(不创建新的文件处理程序)让一个进程检测其他进程是否已释放锁?
这主要是学术上的好奇心。我知道这可以通过创建一个新的文件处理程序来处理,或者作为使用IPC通知另一个进程的最后手段,但我想知道flock系统是否有内置的方法来检测锁的重复?
答案 0 :(得分:1)
flock
在文件句柄级别上运行(在PHP术语中,在fopen
级别返回的文件句柄资源上),这样当你分叉时,两个进程将具有锁定,因为每个人都有相同资源的副本。
flock
的目的是防止同时访问,只要您不与另一个进程共享文件句柄就可以。由于分享是一项自愿行动,不是一个实际问题;如果你分享,你需要做出额外的安排,以保持锁定排他性。
在学术层面,虽然内核可能会在fork之后检测锁定重复(毕竟,它知道你有一个与锁定条目相关联的打开文件描述符) ,实施使得无法对此采取行动。