我正在阅读几个小时,但无法理解两个锁之间有什么区别.我唯一理解的是,fcntl()lock提供了一个可以锁定特定字节的粒度锁,并且只fcntl()支持NFS锁定.
据说差异在于它们的语义,它们在被重复dup()或同时重复时表现如何fork(),但我无法理解实践中的差异.
我的情况是我正在写入fork()基于服务器的日志文件,其中每个分叉进程在发生某些事件时写入同一文件.我为什么要使用flock(),为什么我要使用fcntl()锁?
Nor*_*rtM 10
我试图根据可用的文档找出差异并得出以下结论(如果我错了请纠正我):
使用fcntl()(POSIX):
您在文件系统级别的文件上创建一个锁记录,包括进程ID.
如果进程终止或关闭此文件的任何文件描述符,系统将删除锁定记录.
如果未通过写访问打开文件描述符,则对独占锁的请求将失败.
简单地说:fnctl锁作为Process < - > File关系工作,忽略filedescriptors
flock()(BSD)是不同的(Linux:因为内核2.0,flock()本身就是作为系统调用实现的,而不是作为对fcntl的调用在GNU C库中模拟的):
flock()在系统的"打开文件描述"上创建锁.open()调用生成"打开文件描述".
filedescriptor(FD)是对"打开文件描述"的引用.dup()或fork()生成的FD引用相同的"打开文件描述".
进程可以通过多次打开()文件为一个文件生成多个"打开文件描述"
flock()通过FD在"打开文件描述"上放置它的锁
因此,flock()可用于同步进程和线程之间的文件访问(在一个或多个进程中).
在您的方案中,您可能希望使用基于fcntl()的锁,因为您的分叉进程将自己打开()日志文件,并且不希望继承具有可能放置锁的文件描述符.
如果您需要在多个线程之间进行同步(可能在多个进程中),则应该使用基于flock()的锁,如果您的系统支持它们而不通过fcntl()进行仿真.然后每个线程都需要打开()文件,而不是使用dup()ed或fork()ed句柄.