fcntl文件锁
2015-10-08 19:54
330 查看
fcntl的非强制文件锁(锁定后仍可读写),通过F_GETLK判断是否锁定,再决定是否加锁
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
extern int errno;
int main(){
pid_t pid1;
struct flock flk1;
int fd1;
ssize_t nread;
char var[]="abcdef";
char var2[10]={0};
if(( fd1 = open("tem1",O_RDWR|O_CREAT|O_TRUNC|O_SYNC,00666))==-1){
printf("open file err!");
exit(-1);
}
flk1.l_type=F_WRLCK;
flk1.l_whence=SEEK_SET;
flk1.l_start=0;
flk1.l_len=100;
if(fcntl(fd1,F_SETLK,&flk1)==-1){
printf("fcntl lock err !");
exit(-1);
}
printf("lock pid is %d\n",flk1.l_pid);
write(fd1,var,sizeof(var));
// FILE *fp =
// fflush();
lseek(fd1,0,SEEK_SET);
if((nread = read(fd1,var2,10))==-1){
printf("read err ! %d\n",errno);
exit(-1);
}
printf("%s\n",var2);
if((pid1=fork())<0){
printf("fork err !");
exit(-1);
}
if(pid1==0){
char var1[10]="zxz";
char var3[30];
memset(var3,0,30);
fcntl(fd1,F_GETLK,&flk1);
printf("%d\n",flk1.l_type);
lseek(fd1,0,SEEK_SET);
write(fd1,var1,10);
lseek(fd1,0,SEEK_SET);
read(fd1,var3,30);
printf("%s\n",var3);
return 0;
}
wait();
return 0;
}
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
extern int errno;
int main(){
pid_t pid1;
struct flock flk1;
int fd1;
ssize_t nread;
char var[]="abcdef";
char var2[10]={0};
if(( fd1 = open("tem1",O_RDWR|O_CREAT|O_TRUNC|O_SYNC,00666))==-1){
printf("open file err!");
exit(-1);
}
flk1.l_type=F_WRLCK;
flk1.l_whence=SEEK_SET;
flk1.l_start=0;
flk1.l_len=100;
if(fcntl(fd1,F_SETLK,&flk1)==-1){
printf("fcntl lock err !");
exit(-1);
}
printf("lock pid is %d\n",flk1.l_pid);
write(fd1,var,sizeof(var));
// FILE *fp =
// fflush();
lseek(fd1,0,SEEK_SET);
if((nread = read(fd1,var2,10))==-1){
printf("read err ! %d\n",errno);
exit(-1);
}
printf("%s\n",var2);
if((pid1=fork())<0){
printf("fork err !");
exit(-1);
}
if(pid1==0){
char var1[10]="zxz";
char var3[30];
memset(var3,0,30);
fcntl(fd1,F_GETLK,&flk1);
printf("%d\n",flk1.l_type);
lseek(fd1,0,SEEK_SET);
write(fd1,var1,10);
lseek(fd1,0,SEEK_SET);
read(fd1,var3,30);
printf("%s\n",var3);
return 0;
}
wait();
return 0;
}
相关文章推荐
- 测试知识点
- 页面跳转和iframe相互访问
- nginx location匹配规则
- 这样好用的ReactiveCocoa,根本停不下来【转载】
- top 命令详解
- border
- BestCoder #58 div1
- UVA437
- LeetCode OJ:Valid Palindrome(验证回文)
- 关于一些对location认识的误区
- CYC-爱心暖暖的小动画
- UESTC 1712 Easy Problem With Numbers 除法对和数取模,分解,线段树
- Java 安全套接字编程以及 keytool 使用最佳实践
- 第6周项目2--建立链栈算法库
- NSUserDefaults
- 【前端学习】javascript作用域(链)和this
- UIScorollView运用与属性详解
- 最小生成树之prim算法
- 仓储管理流程图
- 导入https证书