fcntl函数锁的功能

 fcntl 函数语法要点
所需头文件
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
函数原型
int fcnt1(int fd, int cmd, struct flock *lock)
函数传入值
fd: 文件描述符
cmd:
F_DUPFD:复制文件描述符
F_GETFD:获得 fd 的 close-on-exec 标志,若标志未设置,则文件经过 exec函数之后仍保持打开状态
F_SETFD:设置 close-on-exec 标志,该标志以参数 arg 的 FD_CLOEXEC 位决定
F_GETFL:得到 open 设置的标志
F_SETFL:改变 open 设置的标志
F_GETFK:根据 lock 描述,决定是否上文件锁
F_SETFK:设置 lock 描述的文件锁
F_SETLKW:这是 F_SETLK 的阻塞版本(命令名中的 W 表示等待(wait) 。)如果存在其他锁,则调用进程睡眠;如果捕捉到信号则睡眠中断
F_GETOWN:检索将收到 SIGIO 和 SIGURG 信号的进程号或进程组号
F_SETOWN:设置进程号或进程组号
Lock: 结构为 flock,设置记录锁的具体状态,后面会详细说明
struct flock {
short   l_type;
off_t    l_start;
short   l_whence;
off_t    l_len;
pid_t    l_pid;
}
lock 结构变量取值
l_type:
F_RDLCK:读取锁(共享锁)
F_WRLCK:写入锁(排斥锁)
F_UNLCK:解锁
l_stat:
相对位移量(字节)
l_whence:相对位移量的起点(同 lseek的 whence)。
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小
l_len:
加锁区域的长度
为加锁整个文件,通常的方法是将 l_start 说明为 0, l_whence 说明为 SEEK_SET, l_len 说明为 0。
函数返回值
成功: 0
出错:-1


fcntl 使用实例
/*lock_set 函数*/
void lock_set(int fd, int type)
{
    struct flock lock;
    lock.l_whence = SEEK_SET;//赋值 lock 结构体
    lock.l_start = 0;
    lock.l_len =0;
   
    while(1)
    {
        lock.l_type = type;
/*根据不同的 type 值给文件上锁或解锁*/
        if((fcntl(fd, F_SETLK, &lock)) == 0)
        {
            if( lock.l_type == F_RDLCK )
                printf("read lock set by %d\n",getpid());
            else if( lock.l_type == F_WRLCK )
                printf("write lock set by %d\n",getpid());
            else if( lock.l_type == F_UNLCK )
                printf("release lock by %d\n",getpid());
            return;
        }
/*判断文件是否可以上锁*/
        fcntl(fd, F_GETLK,&lock);
/*判断文件不能上锁的原因*/
        if(lock.l_type != F_UNLCK){
/*/该文件已有写入锁*/
            if( lock.l_type == F_RDLCK )
                printf("read lock already set by %d\n",lock.l_pid);
/*该文件已有读取锁*/
            else if( lock.l_type == F_WRLCK )
                printf("write lock already set by %d\n",lock.l_pid);
            getchar();
        }
    }
}


下面的实例是测试文件的写入锁,这里首先创建了一个 hello 文件,之后对其上写入锁,最后释放写入锁。代码如下所示:


/*fcntl_write.c 测试文件写入锁主函数部分*/
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int fd;
/*首先打开文件*/
    fd = open("hello",O_RDWR | O_CREAT, 0666);
    if(fd < 0)
    {
        perror("open");
        exit(1);
    }
/*给文件上写入锁*/
    lock_set(fd, F_WRLCK);
    getchar();
/*给文件接锁*/
    lock_set(fd, F_UNLCK);
    getchar();
    close(fd);
    exit(0);
}

摘自:http://jiangcshuai.blog.163.com/blog/static/184546065201144103424264/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值