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;
}