共同点
-
都支持阻塞和非阻塞模式
-
只能操作于文件,而不是目录
-
当进程结束或者终止的时候,锁都会被自动释放
flock
-
只能是劝告锁,因此其他进程只要拥有合适的权限,可以自由地访问文件
-
和 fd 相对应(BSD lock)
-
fork、dup 后复制的 fd 拥有相同的锁,且对其中任意一个 fd 进行 LOCK_UN 操作都会释放锁,或者这些 fd 都被关闭
-
使用 open 对同一个文件打开两个 fd,这两个的 fd 对应的 锁是相互独立的:如果使用 fd1 锁定,那么再使用 fd2 锁定就会失败
-
获得的锁会在 execve 中被保留下来
-
将锁从共享转换成互斥,或者反方向转换,不是原子操作,而是先释放旧锁,然后添加新锁
-
不能用于 NFS
-
不进行死锁检查
fcntl
-
劝告记录锁
-
与(inode, pid)相对应
-
锁不会随着 fork 而被继承,但是在 execve 中被保留了下来
-
由于 stdio 有缓存,该锁不应使用 stdio,而应配合 read, write 来使用
-
对于文件的一个区域,一个进程只能拥有一种锁,如果要在这个区域施加新锁,那么旧锁会被转化成新锁
-
内核会进行死锁检查
-
如果进程关闭了文件的任何一个描述符,则与这个文件相关的所有锁都会被释放;线程共享同一个锁,也就是没办法同步线程
-
也可以和 fd 相对应,如果如此则解决了第八个问题
-
强制锁,租借锁
网友评论