概述
flock锁不关心线程事实上,它们也不关心进程。如果在两个进程中使用相同的文件描述符(通过fork继承),那么用FD锁定文件的任何一个进程都将获得两个进程的锁。换句话说,在下面的代码中,两个flock调用都将返回成功:子进程锁定文件,然后父进程获取相同的锁而不是阻塞,因为它们都是相同的FD。在import fcntl, time, os
f = open("testfile", "w+")
print "Locking..."
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
print "locked"
fcntl.flock(f.fileno(), fcntl.LOCK_UN)
if os.fork() == 0:
# We're in the child process, and we have an inherited copy of the fd.
# Lock the file.
print "Child process locking..."
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
print "Child process locked..."
time.sleep(1000)
else:
# We're in the parent. Give the child process a moment to lock the file.
time.sleep(0.5)
print "Parent process locking..."
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
print "Parent process locked"
time.sleep(1000)
在同一个令牌上,如果您使用不同的文件描述符锁定同一个文件两次,那么无论您是在同一个进程中还是在同一个线程中,这些锁都将相互阻塞。见flock(2):If a process uses open(2) (or similar) to obtain more than one descriptor for the same file, these descriptors are treated independently by flock(). An attempt to lock the file using one of these file descriptors may be denied by a lock that the calling process has already placed via another descriptor.
记住,对于Linux内核来说,进程和线程本质上是相同的,并且内核级api通常对它们的处理是相同的。在大多数情况下,如果syscall记录进程间的子/父行为,那么线程也会有同样的情况。在
当然,您可以(也可能应该)亲自测试这种行为。在
最后
以上就是稳重时光为你收集整理的linux fcntl 线程 文件加锁,Python的fcntl.植绒函数提供线程级的文件访问锁定?的全部内容,希望文章能够帮你解决linux fcntl 线程 文件加锁,Python的fcntl.植绒函数提供线程级的文件访问锁定?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复