我是靠谱客的博主 阔达洋葱,最近开发中收集的这篇文章主要介绍文件锁 flock/fcntl,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

多个进程同时操作一个文件

1. flock

int flock(int fd, int operation);

LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定(读锁定)
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定
LOCK_UN 解除文件锁定状态
LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合

2. fcntl

int fcntl(int fd, int cmd, ... /* arg */ );
struct flock {
...
short l_type;
/* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence;
/* How to interpret l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start;
/* Starting offset for lock */
off_t l_len;
/* Number of bytes to lock */
pid_t l_pid;
/* PID of process blocking our lock
(F_GETLK only) 持有锁 */
...
};
//lock set
struct flock lock = {0};
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 10;
ret = fcntl(fd, F_SETLK, &lock);
ret = fcntl(fd, F_SETLKW, &lock);
//阻塞模式
//lock get
if((ret = fcntl(fd, F_GETLK, &lock)) == 0)
{
switch(lock.l_type)
{
case F_UNLCK:
puts("F_UNLCK.");
break;
case F_RDLCK:
puts("F_RDLCK.");
break;
case F_WRLCK:
printf("l_start = %dn", (int)lock.l_start);
printf("l_len = %dn", (int)lock.l_len);
printf("l_pid = %dn", (int)lock.l_pid);
puts("F_WRLCK.");
break;
}
} 

各种锁将在相应的文件描述符被关闭时自动清除

死锁现象
两个程序同一时间对字节1和字节2进行修改。程序A选择先修改字节2,再修改字节1,而程序B先修改字节1,再修改字节2
两个程序应该以同样的顺序对他们准备修改的字节施行封锁,或者对一个更大的文件区域实施封锁

3. O_APPEND
不加锁也可以,但需要O_APPEND选项

最后

以上就是阔达洋葱为你收集整理的文件锁 flock/fcntl的全部内容,希望文章能够帮你解决文件锁 flock/fcntl所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部