fcnt记录锁

fcntl 记录锁

当我们有多个进程要访问同一个文件的时候,为了防止多进程访问导致的不一致,我们就要考虑进程间的同步问题了。fcntl是一个非常强大的函数,在这里我们可以使用它来给文件的某一个部分上锁。int fcntl(int filedes, int cmd, ... /* struct flock *flockptr */ ); 这是一个拥有可变参数的函数声明,filedes自然是要操作的文件描述符,对与记录锁相关的操作,cmd只能是F_GETLK, F_SETLK, 或者 F_SETLKW,而第三个参数则必须是一个指向flock结构体的指针,该结构体的内部结构:

 struct flock {  

    short l_type;/*F_RDLCK, F_WRLCK, or F_UNLCK */  

    off_t l_start;/*offset in bytes, relative to l_whence */  

        short l_whence;/*SEEK_SET, SEEK_CUR, or SEEK_END */  

     off_t l_len;/*length, in bytes; 0 means lock to EOF */  

    pid_t l_pid;/*returned with F_GETLK */  

  }; 


第一个成员是加锁的类型:只读锁,读写锁,或是解锁。l_start和l_whence用来指明加锁部分的开始位置,l_len是加锁的长度,l_pid是加锁进程的进程id。比如说,我们现在需要把一个文件的前三个字节加读锁,则该结构体的l_type=F_RDLCK, l_start=0, l_whence=SEEK_SET, l_len=3,l_pid不需要指定,然后调用fcntl函数时,cmd参数使用F_SETLK.

 

例子:

int  waldirlock(Wal *w)  

{  

    int r;  

    int fd;  

    struct flock lk;  

    char path[PATH_MAX];   

    r = snprintf(path, PATH_MAX, "%s/lock", w->dir);  

    if (r > PATH_MAX) {  

        printf("path too long: %s/lock", w->dir);  

        return 0;  

    }  

    fd = open(path, O_WRONLY|O_CREAT, 0600);  

    if (fd == -1) {  

        printf("open");  

        return 0;  

    }  

    lk.l_type = F_WRLCK;  

    lk.l_whence = SEEK_SET;  

    lk.l_start = 0;  

    lk.l_len = 0;  

    r = fcntl(fd, F_SETLK, &lk);  

    if (r) {  

        printf("fcntl");  

        return 0;  

    }    

    return 1;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值