Linux高级程序_IO操作_lock
1文件锁定设计原理
1.1文件锁定类型
- 强制锁Mandatory lock:内核相关,较为底层
- 建议锁Advisory lock:用户层面,
1.2文件锁结构
- kernel源码 fs.h→file_lock
2文件锁定函数调用方法
2.1 fcntl函数
记录锁函数 int fcntl(int fildes,int cmd,struct flock*arg);
成功返回非负整数,失败-1
头文件:<unistd.h>,<fcntl.h>
cmd:
- F_GETLK //得到锁
- F_SETLK //设置锁
- F_SETLKW //设置锁并等待返回
struct flock{
short l_type;//锁类型,F_RDLCK(共享锁),F_WRLCK(独占锁),F_UNLCK(释放锁)
short l_wherece;//锁区域开始地址的相对位置,类似于lseek中whence参数
long l_start;//锁区域开始地址偏移量,同l_whence共同确定锁区域
long l_len;//锁的长度,0表示锁至文件末
long l_pid;//拥有锁的进程ID号
};
默认为建议锁,需要强制锁需要重新挂载
sudo mount -oremount,mand/ //重新挂载根目录
sudo chmod g+s,g-x[filename]
实例:
写一个hello.txt内容为 tc1111
编写独占锁执行文件file_lock.c 其中while(1){rd++};相当于让hello.txt一直在更改rd数值,hello.txt一直被占用。
并且编译对hello.txt上独占锁,由于默认为建议锁位用户层面,若需要独占锁,则需要
- sudo mount -oremount,mand/ //重新挂载根目录
- sudo chmod g+s,g-x[filename]
- 执行file_lock之后,控制台1返回锁值0,表明上锁成功
切换至控制台2,cat hello.txt 查看内容发现无法读取内容,这是因为hello.txt在控制台1一直处于执行状态,反复进行对hello.txt执行rd++操作,而hello.txt又是设定为独占锁,则控制台2对hello.txt同时进行查看操作会阻塞。
切换至控制台1,执行ctrl+c,强制退出命令执行,结束控制台1对hello.txt的操作。
之后切换至控制台2,发现控制台2已经读出了hello.txt的内容,因为控制台1已经没有对hello.txt进行操作
2.3flock(较为上层,对fcntl函数的封装)
int flock(int fd,int operation);
operation:
LOCK_SH //共享锁
LOCK_EX //独占锁
LOCK_UN //释放锁
3线程锁定
void flockfile(FILE *stream)
void ftrylockfile(FILE *stream)
void funlockfile(FILE *stream)