fcntl函数

fcntl有强大的功能,它能够复制一个现有的描述符,获得/设置文件描述符标记,获得/设置文件状态标记,获得/设置异步I/O所有权,获得/设置纪录锁。

当多个用户共同使用,操作一个文件的情况,Linux通常采用的方法就是给文件上锁,来避免共享资源产生竞争的状态。

文件锁包括了  建议性锁  和  强制性锁。

建议性锁要求每个上锁的文件的进程都要检查是否有锁存在,并且尊重已有的锁,在一般情况下,内核和系统都不使用建议性锁。

强制性锁是由内核执行的锁,当一个文件被上锁进行读写操作的时候,内核将阻止其他任何文件对其进行读写操作。每次读写操作都要检查是否有锁存在。

在Linux中实现上锁的函数有lock()和fcntl()。

lock()用于对文件施加建议性锁
fcntl()用于对文件施加建议性锁和强制性锁都行。同时还可以对文件某一条纪录进行上锁,也就是记录锁。

记录锁分为  读取锁(共享锁,它能够使多个进程都能在文件的同一部分建立读取锁)  和  写入锁(排斥锁,在任何时刻只能有一个进程在文件的某部分建立写入锁。)。

fcntl函数原型
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>

int fcntl(int fd,   //文件描述符
          int cmd , //不同的命令
          struct flock  *lock)  //设置记录锁的具体状态

cmd取值:
F_DUPFD   复制文件描述符
F_GETFD   获得fd的close-on-exec标志
F_SETFD   设置close-on-exec标志
F_GETFL   获得open设置标志
F_SETFL   设置lock描述的标志
F_GETLK   测试该锁是否被另外一把锁排斥
F_SETLKW  如果存在其他锁,则调用进程睡眠,如果捕捉到信号则睡眠中断
F_GETOWN  检索收到的SIGIO和SIGURG信号的进程号或者进程组号
F_SETOWN  设置进程号或进程组号

这里的lock结构体如下:
struct flock
{
    short l_type;   /*F_RDLCK(读取锁),F_WRLCK(写入锁),F_UNLCK(解锁)*/
    off_t l_start;  /*相对偏移量(字节)*/
    short l_whence; /*SEEK_SET ,SEEK_CUR ,SEEK_END */
    off_t l_len;    /*加锁区域长度*/
    pid_t l_pid;
}

成功:0
出错:-1
提示:如果加锁整个文件通常的方法是将l_start设置为0,l_whence设置为SEEK_SET, l_len设置为0。










你可能感兴趣的:(linux,F#)