Che*_*glu 6 linux locking fcntl
如果一个进程给一个文件一个写锁,然后它生成一个子进程,那么子进程会继承锁吗?如果是,那么有2个进程有写锁,我了解到只有1个进程可以有写锁,有些道理吗?这是一个测试Python代码
#!/usr/bin/python
import fcntl
import time
import os
fp = open('test.ini','w')
fcntl.flock(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
pid = os.fork()
if pid > 0:
time.sleep(10)
exit(0)
if pid == 0:
time.sleep(100)
exit(0)
Run Code Online (Sandbox Code Playgroud)
当父级存在时,我尝试获取文件 test.ini 的锁,但失败了 ,所以我猜测子级拥有锁
因此,正如您在集群(2)的手册页中所指出的,锁和文件之间的关系如下:
由flock()创建的锁与打开的文件描述相关联(参见open(2))。这意味着重复的文件描述符(例如,由 fork(2) 或 dup(2) 创建的)引用相同的锁,并且可以使用这些文件描述符中的任何一个来修改或释放该锁。此外,锁可以通过对任何这些重复文件描述符执行显式 LOCK_UN 操作来释放,或者当所有此类文件描述符都已关闭时释放。
需要明确的是,它指出了释放锁时的两种情况:
LOCK_UN
这些重复文件描述符中的任何一个进行显式操作在问题提供的代码中,父执行或子执行中都没有显式解锁,因此不会满足第一个条件。类似地,由于第二个条件要求所有此类文件描述符都已关闭,因此提前终止父进程将无法满足这一要求;仅当子进程稍后终止时。
您可以通过添加显式解锁来满足这一点:
fcntl.flock(fp, fcntl.LOCK_UN)
Run Code Online (Sandbox Code Playgroud)
在退出之前在父代码路径中,然后在子进程退出之前测试从单独的进程获取锁定。修改后的代码如下:
#!/usr/bin/python
import fcntl
import time
import os
fp = open('test.ini','w')
fcntl.flock(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
pid = os.fork()
if pid > 0:
time.sleep(10)
fcntl.flock(fp, fcntl.LOCK_UN)
exit(0)
if pid == 0:
time.sleep(100)
exit(0)
Run Code Online (Sandbox Code Playgroud)
您还可以读取/proc/locks
或使用lslocks
(相同的解析器)来显示系统中当前持有的文件锁。前者的内容如下:
1: FLOCK ADVISORY WRITE 358 00:15:628 0 EOF
2: FLOCK ADVISORY WRITE 296 00:15:608 0 EOF
3: FLOCK ADVISORY WRITE 291 00:15:599 0 EOF
4: FLOCK ADVISORY WRITE 25874 b3:02:256617 0 EOF
Run Code Online (Sandbox Code Playgroud)
以及后者的输出:
COMMAND PID TYPE SIZE MODE M START END PATH
(unknown) 25874 FLOCK WRITE 0 0 0 /...
cron 291 FLOCK WRITE 0 0 0 /run...
(unknown) 296 FLOCK WRITE 0 0 0 /run...
(unknown) 358 FLOCK WRITE 0 0 0 /run...
Run Code Online (Sandbox Code Playgroud)
当通过 PID 过滤此输出时,要使用的是父 PID,除非子进程中的模式已更改。
归档时间: |
|
查看次数: |
1598 次 |
最近记录: |