用`fcntl`和`flock`锁定有什么区别?

贵格会

我正在阅读数小时,但无法理解两个锁之间的区别我唯一了解的是fcntl()锁提供的粒度锁可以锁定特定的字节,并且仅fcntl()支持NFS锁定。

据说它们的语义不同,被dup()或while重复时它们的行为如何fork(),但我不了解实际的区别。

我的情况是,我正在fork()基于服务器的服务器上写入日志文件,其中,当发生某些情况时,每个分叉的进程都将写入同一文件为什么flock()要使用fcntl(),为什么要使用锁?

诺伯特

我试图根据可用的文档找出差异,并得出以下结论(如果我错了,请纠正我):

使用fcntl()(POSIX):

  • 您可以在文件系统级别的文件上创建一个锁定记录,包括进程ID。

  • 如果该进程死亡或关闭该文件的任何文件描述符,则锁定记录将被系统删除。

  • 如果未使用写访问权限打开文件描述符,则排他锁请求将失败。

  • 简单:fnctl锁定作为进程<->文件关系工作,而忽略filedescriptor

flock()(BSD)是不同的(Linux:从内核2.0开始,flock()是本身作为系统调用实现的,而不是作为对fcntl的调用在GNU C库中模拟的):

  • flock()在系统的“打开文件描述”上创建锁。“打开文件描述”是通过open()调用生成的。

  • 文件描述符(FD)是对“打开文件描述”的引用。dup()fork()生成的FD引用相同的“打开文件描述”。

  • 一个进程可以通过多次打开()文件来为一个文件生成多个“打开文件描述”

  • flock()通过FD将其锁放置在“打开文件描述”中

  • 因此,flock()可用于在进程和线程(在一个或多个进程中)之间同步文件访问。

  • 有关“打开文件描述”的详细信息,请参见flock(2),尤其是open(2)手册页。

在您的方案中,您可能希望使用基于fcntl()的锁,因为您的分叉进程将自行打开日志文件,并且不希望继承带有可能放置的锁的filedescriptor。

如果需要在多个线程之间进行同步(可能在多个进程中进行同步),并且如果系统支持的锁没有fcntl()仿真,则应使用基于flock()的锁。然后,每个线程都需要open()文件,而不是使用dup()ed或fork()ed句柄。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

撤销会话和帐户锁定有什么区别?

来自分类Dev

Android的密码锁定和PIN锁定有什么区别?

来自分类Dev

角组件:单向绑定和属性绑定有什么区别?

来自分类Dev

锁定和过期用户帐户有什么区别?

来自分类Dev

编译时多态与静态绑定有什么区别?

来自分类Dev

编译时多态与静态绑定有什么区别?

来自分类Dev

pthread读写器锁和基于fcntl()的文件锁之间有什么区别?

来自分类Dev

Java ee 6/7中模块和应用程序的jndi绑定有什么区别?

来自分类Dev

用例图和uml图有什么区别?

来自分类Dev

“ as?”,“ as!”和“ as”有什么区别?

来自分类Dev

$ *和$ @有什么区别

来自分类Dev

$和〜有什么区别?

来自分类Dev

/ * ... * /和/ ** ... * /有什么区别

来自分类Dev

!=和<>有什么区别?

来自分类Dev

ö和ö有什么区别?

来自分类Dev

$ *和$ @有什么区别?

来自分类Dev

“ ==”和“ =〜”有什么区别?

来自分类Dev

= +和+ =有什么区别

来自分类Dev

$ @和$ *有什么区别

来自分类Dev

+ =和+有什么区别?

来自分类Dev

$ _和!$有什么区别?

来自分类Dev

\ 和 \\ 有什么区别

来自分类Dev

&&和||和有什么区别?

来自分类Dev

FormGroup 和 FormArray 有什么区别?什么时候用什么?

来自分类Dev

扩展用例和父用例有什么区别?

来自分类Dev

!= null和!== null有什么区别?

来自分类Dev

ConnectEx和_ConnectEx有什么区别?

来自分类Dev

LDADD和LIBADD有什么区别?

来自分类Dev

tempfile和mktemp有什么区别?