fcntl文件锁

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值