我是靠谱客的博主 妩媚八宝粥,最近开发中收集的这篇文章主要介绍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 %dn",getpid());
            else if( lock.l_type == F_WRLCK )
                printf("write lock set by %dn",getpid());
            else if( lock.l_type == F_UNLCK )
                printf("release lock by %dn",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 %dn",lock.l_pid);
/*该文件已有读取锁*/
            else if( lock.l_type == F_WRLCK )
                printf("write lock already set by %dn",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/

最后

以上就是妩媚八宝粥为你收集整理的fcntl函数锁的功能的全部内容,希望文章能够帮你解决fcntl函数锁的功能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部