flock v.s. fcntl

共同点

  1. 都支持阻塞和非阻塞模式

  2. 只能操作于文件,而不是目录

  3. 当进程结束或者终止的时候,锁都会被自动释放

flock

  1. 只能是劝告锁,因此其他进程只要拥有合适的权限,可以自由地访问文件

  2. 和 fd 相对应(BSD lock)

  3. fork、dup 后复制的 fd 拥有相同的锁,且对其中任意一个 fd 进行 LOCK_UN 操作都会释放锁,或者这些 fd 都被关闭

  4. 使用 open 对同一个文件打开两个 fd,这两个的 fd 对应的 锁是相互独立的:如果使用 fd1 锁定,那么再使用 fd2 锁定就会失败

  5. 获得的锁会在 execve 中被保留下来

  6. 将锁从共享转换成互斥,或者反方向转换,不是原子操作,而是先释放旧锁,然后添加新锁

  7. 不能用于 NFS

  8. 不进行死锁检查

fcntl

  1. 劝告记录锁

  2. 与(inode, pid)相对应

  3. 锁不会随着 fork 而被继承,但是在 execve 中被保留了下来

  4. 由于 stdio 有缓存,该锁不应使用 stdio,而应配合 read, write 来使用

  5. 对于文件的一个区域,一个进程只能拥有一种锁,如果要在这个区域施加新锁,那么旧锁会被转化成新锁

  6. 内核会进行死锁检查

  7. 如果进程关闭了文件的任何一个描述符,则与这个文件相关的所有锁都会被释放;线程共享同一个锁,也就是没办法同步线程

  8. 也可以和 fd 相对应,如果如此则解决了第八个问题

  9. 强制锁,租借锁

参考

File locking in Linux

你可能感兴趣的:(flock v.s. fcntl)