文件的读写锁
来源:互联网 发布:空中霸王淘宝 编辑:程序博客网 时间:2024/06/05 15:01
如何使用linux 的文件读写锁呢
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
fprintf(stderr,"line:%d",line);
perror(str_error);
exit(1);
}
//设置文件锁
int lock_set(int fd,struct flock *lock){
if(fcntl(fd,F_SETLK,lock)==0){
if(lock->l_type==F_RDLCK){
printf("set read lock,pid:%d\n",getpid());
}
else if(lock->l_type==F_WRLCK){
printf("set write lock,pid:%d\n",getpid());
}
else if(lock->l_type==F_UNLCK){
printf("set release lock,pid:%d\n",getpid());
}
}else{
perror("lock file fail\n");
return -1;
}
return 0;
}
//测试锁是否可获取
int lock_test(int fd,struct flock *lock){
if(fcntl(fd,F_GETLK,lock)==0){
if(lock->l_type==F_UNLCK){
printf("lock can be set\n");
return 0;
}else{
if(lock->l_type==F_WRLCK){
printf("can'n be set lock, write lock has been set by:%d\n",lock->l_pid);
}
else if(lock->l_type==F_RDLCK){
printf("can'n be set lock, read lock has been set by:%d\n",lock->l_pid);
}
return -2;
}
}else{
perror("get lock file fail\n");
return -1;
}
//return 0;
}
int main(int argc ,char **argv){
int fd;//文件描述符
int ret;
struct flock lock;
char read_buf[32];
int read_size;
char s[]="hellow word\n",buff[80];
if((fd=open("11.txt",O_CREAT|O_TRUNC|O_RDWR ,S_IRWXU))==-1){
//perror("open");
//exit(1);
my_error("open",__LINE__);
}
if(write(fd,"test lock",10)!=10){
my_error("write",__LINE__);
}
//初始化lock
memset(&lock,0,sizeof(struct flock));
lock.l_start=SEEK_SET;
lock.l_len=0;
lock.l_whence=0;
//设置读锁
lock.l_type=F_RDLCK;
if(lock_test(fd,&lock)==0){
lock.l_type=F_RDLCK;
lock_set(fd,&lock);
}
//读数据
lseek(fd,0,SEEK_SET);
if((ret=read(fd,read_buf,10))<0){
my_error("read",__LINE__);
}
read_buf[ret]='\0';
//打印
printf("%s\n",read_buf);
//暂停
getchar();
//检测是否能获取写锁
lock.l_type=F_WRLCK;
if(lock_test(fd,&lock)==0){
lock.l_type=F_WRLCK;
lock_set(fd,&lock);
}
//释放锁
lock.l_type=F_UNLCK;
lock_set(fd,&lock);
close(fd);
return 0;
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
//错误打印
void my_error(const char *str_error,int line){fprintf(stderr,"line:%d",line);
perror(str_error);
exit(1);
}
//设置文件锁
int lock_set(int fd,struct flock *lock){
if(fcntl(fd,F_SETLK,lock)==0){
if(lock->l_type==F_RDLCK){
printf("set read lock,pid:%d\n",getpid());
}
else if(lock->l_type==F_WRLCK){
printf("set write lock,pid:%d\n",getpid());
}
else if(lock->l_type==F_UNLCK){
printf("set release lock,pid:%d\n",getpid());
}
}else{
perror("lock file fail\n");
return -1;
}
return 0;
}
//测试锁是否可获取
int lock_test(int fd,struct flock *lock){
if(fcntl(fd,F_GETLK,lock)==0){
if(lock->l_type==F_UNLCK){
printf("lock can be set\n");
return 0;
}else{
if(lock->l_type==F_WRLCK){
printf("can'n be set lock, write lock has been set by:%d\n",lock->l_pid);
}
else if(lock->l_type==F_RDLCK){
printf("can'n be set lock, read lock has been set by:%d\n",lock->l_pid);
}
return -2;
}
}else{
perror("get lock file fail\n");
return -1;
}
//return 0;
}
int main(int argc ,char **argv){
int fd;//文件描述符
int ret;
struct flock lock;
char read_buf[32];
int read_size;
char s[]="hellow word\n",buff[80];
if((fd=open("11.txt",O_CREAT|O_TRUNC|O_RDWR ,S_IRWXU))==-1){
//perror("open");
//exit(1);
my_error("open",__LINE__);
}
if(write(fd,"test lock",10)!=10){
my_error("write",__LINE__);
}
//初始化lock
memset(&lock,0,sizeof(struct flock));
lock.l_start=SEEK_SET;
lock.l_len=0;
lock.l_whence=0;
//设置读锁
lock.l_type=F_RDLCK;
if(lock_test(fd,&lock)==0){
lock.l_type=F_RDLCK;
lock_set(fd,&lock);
}
//读数据
lseek(fd,0,SEEK_SET);
if((ret=read(fd,read_buf,10))<0){
my_error("read",__LINE__);
}
read_buf[ret]='\0';
//打印
printf("%s\n",read_buf);
//暂停
getchar();
//检测是否能获取写锁
lock.l_type=F_WRLCK;
if(lock_test(fd,&lock)==0){
lock.l_type=F_WRLCK;
lock_set(fd,&lock);
}
//释放锁
lock.l_type=F_UNLCK;
lock_set(fd,&lock);
close(fd);
return 0;
}
编译
gcc -o my_lokc my_lokc.c
使用两个终端 测试 ./my_lokc
第一个终端:
lock can be set
set read lock,pid:19580
test lock
f
lock can be set
set write lock,pid:19580
set release lock,pid:19580
第二个终端:
lock can be set
set read lock,pid:19582
test lock
a
can'n be set lock, read lock has been set by:19580
set release lock,pid:19582
0 0
- 文件的读写锁
- 串口的读写,文件读写
- INI文件的读写
- 读写文件的例子
- INI文件的读写
- 关于文件的读写
- 文件的读写操作
- 文件的读写操作
- properties文件的读写
- 读写服务器端的文件
- 位图文件的读写
- C++文件的读写
- ini文件的读写
- 文件的读写
- 自定义文件的读写
- 文件的读写操作
- 文件的读写
- 文件读写的问题
- Linux下进程间通信的六种机制详解
- python 之 set
- 关于unity中Assetbundle动态加载
- 撩妹子成功率提高99.89%的方法
- 在ubuntu上部署php的工程文件
- 文件的读写锁
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
- Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project 'myf'. java.
- 和其他一些面向对象的编程语言一样,不是所有的变量(方法)都要通过创建对象来调用,还可以通过给变量(方法)加上static关键字来直接调用。
- VR模式下的UI系统实践概述
- fastdfs的启动停止
- Q27:二叉搜索树与双向链表
- 【读什么APP】诚挚征集好书书摘
- Tomcat Manager介绍