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