克隆(2)与克隆_文件泄漏fcntl锁?

克隆(2)与克隆_文件泄漏fcntl锁?,c,linux,clone,fcntl,C,Linux,Clone,Fcntl,但当我从CLONE(2)中删除CLONE_FILES字段集时,一切都很顺利。其他克隆线程将等待锁定() 其产出如下: Trying to get lock Trying to get lock Trying to get lock Got lock: Got lock: 10287 Got lock: Got lock: 10287 Enter string to write in file : Trying to get lock Enter string to wriGot lock: 1

但当我从CLONE(2)中删除CLONE_FILES字段集时,一切都很顺利。其他克隆线程将等待锁定()

其产出如下:

Trying to get lock
Trying to get lock
Trying to get lock
Got lock: Got lock: 10287
Got lock: Got lock: 10287

Enter string to write in file : Trying to get lock
Enter string to wriGot lock: 10287
Got lock: 10287
Got lock: 10287
Enter string to write in file : Trying to get lock
Got lock: 10287
Got lock: Enter string to write in file :
是否有其他替代方案(使用克隆_文件)?为什么会有这种行为


该领域的初学者。

flock提供的锁定是每个进程,而不是每个线程

来自(我的):

如果另一进程持有不兼容的锁,则对flock()的调用可能会被阻止

对已锁定文件的后续flock()调用将现有锁转换为新锁模式

flock()创建的锁与打开的文件表项相关联

虽然没有明确提到线程,但多个线程共享一个文件表条目,而多个进程不共享。将
CLONE_文件
传递到
CLONE
会导致您的“进程”共享文件表

一个解决方案可能是调用
dup
,生成更多的文件描述符。从文件中:

如果一个进程使用open(2)(或类似)为同一个进程获取多个描述符
文件中,这些描述符由flock()独立处理。试图锁定该文件 使用这些文件描述符之一可能会被调用进程拥有的锁拒绝 已通过另一个描述符放置


请不要使用制表符,并确保缩进正确。特别是像这样一个巨大的代码转储,很少有人会注意阅读所有的东西,如果它是令人厌倦的介绍。我会小心的。如果我不会对同一个文件使用不同的fd,意味着在流程中共享/复制单个fd,而我认为flock也不会工作。我说得对吗?没错。但是,如果您确实使用call dup来获取第二个fd,那么flock将起作用。但是,对于共享fd,是否有合适的解决方案(意味着使用克隆_文件,并且在子线程中不使用dup)?不,使用flock无法做到这一点,Linux就是不能这样工作。解决方案是使用互斥体而不是群集,或者如果需要与其他进程协调,也可以使用互斥体和群集。
Trying to get lock
Trying to get lock
Trying to get lock
Got lock: Got lock: 10287
Got lock: Got lock: 10287

Enter string to write in file : Trying to get lock
Enter string to wriGot lock: 10287
Got lock: 10287
Got lock: 10287
Enter string to write in file : Trying to get lock
Got lock: 10287
Got lock: Enter string to write in file :
Trying to get lock
Got lock: 10311
Trying to get lock
Trying to get lock
Trying to get lock
Trying to get lock