我读了几个小时书,但不明白这两把锁有什么区别。我唯一理解的是fcntl()
锁提供了一个粒度锁,它可以锁定特定的字节,并且只有fcntl()
支持nfs锁定。
有人说,它们的区别在于语义上,当被dup()
复制或被fork()
复制时,它们是如何表现的,但我不明白在实践中有什么区别。
我的场景是,我正在一个基于fork()
的服务器中写入一个日志文件,在该服务器中,当发生某些事情时,每个分叉进程都在写入同一个文件。我为什么要使用flock()
锁,为什么要使用fcntl()
锁?
最佳答案
我试图根据现有文件找出差异,并得出以下结论(如果我错了,请纠正我):
使用fcntl()(posix):
您可以在文件系统级(包括进程id)在文件上创建一个锁记录。
如果进程终止或关闭此文件的任何文件描述符,系统将删除锁定记录。
如果未使用写访问打开文件描述符,则对独占锁的请求将失败。
简单地说:fnctl锁作为一个进程工作文件关系,忽略文件描述符
flock()(bsd)是不同的(linux:由于内核2.0,flock()本身被实现为一个系统调用,而不是在gnu c库中被模拟为对fcntl的调用):
flock()在系统的“打开文件描述”上创建锁。open file descriptions”由open()调用生成。
文件描述符(fd)是对“打开文件描述”的引用。dup()或fork()生成的fds引用相同的“打开文件描述”。
一个进程可以通过多次打开()文件来为一个文件生成多个“打开文件描述”
flock()通过fd在“open file description”上锁定
因此flock()可用于同步进程之间以及线程之间(在一个或多个进程中)的文件访问。
有关“打开文件说明”的详细信息,请参见flock(2)特别是open(2)手册页。
在您的场景中,您可能希望使用基于fcntl()的锁,因为分叉进程将自己打开()日志文件,并且不希望继承带有可能放置的锁的文件描述符。
如果您需要在多个线程之间(可能在多个进程中)进行同步,那么如果您的系统在没有fcntl()模拟的情况下支持flock()锁,则应该使用基于flock()的锁。然后每个线程都需要打开()文件,而不是使用dup()ed或fork()ed句柄。
关于c - 用`fcntl`和`flock`锁定有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29611352/