⽂件锁
前⾔
前⾯我们已经学习了三种IPC的⽅式,但是其中如果我们利⽤共享⽂件或共享内存的⽅式来进⾏通
信,会遇到多个进程同时访问共享资源⽽导致冲突的问题(竞态条件)。下⾯我们将介绍两种最常⽤
的避免冲突的⽅法:本节所讲的⽂件锁和下⼀节所讲的信号量。
的的fcntl
UNIX提供了3种臆法锁住打开的崛件:羊群,提供lockf和的fcntl三者中最灵活和移植性最好的
是的fcntl。
作⽤:锁住⽂件,避免数据混乱。
头⽂件:#include <fcntl.h>
函数原型:int fcntl(int fd,int cmd,... / * struct flock * flockptr * /);
参数说明:
FD:愧件描述符
CMD:指定要进搓的锁操作,包括F_GETLK,F_SETLK或F_SETLKW
fl ockptr:指向fl ock结构的指针
返回值:
成功:根据CMD返回特定值
失败:返回-1
FL玉珠的结构
-----------------------页面5 -----------------------
struct flock {
短L_TYPE; //锁定类型:F_RDLCK,F_WRLCK或F_UNLCK
简短l_whence; //如何解释l_start:SEEK_SET,SEEK_CUR或
SEEK_END
off_t l_start; //锁定的起始偏移量
off_t l_len; //要锁定的字节数
pid_t l_pid; //进程阻塞OU锁定的PID(F_GETLK)
};
示例代码
lock fi lewrite.c写蹴件锁
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
主要(){
int fd;
if((fd = open(“forlock”,O_WRONLY))== - 1){
PERROR(“无法打开”);
出口(1);
}
struct flock lockinfo;
lockinfo.l_type = F_WRLCK;
lockinfo.l_len = 0;
lockinfo.l_pid = GETPID();
lockinfo.l_whence = SEEK_SET;
lockinfo.l_start = 0;
if(fcntl(fd,F_SETLKW,&lockinfo)== - 1){
PERROR(“无法锁定”);
出口(1);
}
int i;
for(i = 0; 我<5; 我++){
写(fd,“Hello world \ n”,strlen(“Hello world \ n”));
}
的printf(“写\ n”);
睡眠(10);
lockinfo.l_type = F_UNLCK;
if(fcntl(fd,F_SETLKW,&lockinfo)== - 1){
PERROR(“无法锁定”);
出口(1);
}
关闭(FD);
}
----------------------- Page 6 -----------------------
lock fi leread.c读愧件锁
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
主要(){
int fd;
if((fd = open(“forlock”,O_RDONLY))== - 1){
PERROR(“无法打开”);
出口(1);
}
struct flock lockinfo;
lockinfo.l_type = F_RDLCK;
lockinfo.l_len = 0;
lockinfo.l_pid = GETPID();
lockinfo.l_whence = SEEK_SET;
lockinfo.l_start = 0;
if(fcntl(fd,F_SETLKW,&lockinfo)== - 1){
PERROR(“无法锁定”);
出口(1);
}
char buf [512];
int n;
while((n = read(fd,buf,512))> 0){
printf(“%。* s”,n,buf);
}
睡眠(10);
lockinfo.l_type = F_UNLCK;
if(fcntl(fd,F_SETLKW,&lockinfo)== - 1){
PERROR(“无法锁定”);
出口(1);
}
关闭(FD);
}
本篇非作者所著:来自一位大神!