zoukankan      html  css  js  c++  java
  • 文件锁

    借助 fcntl函数来实现锁机制。 操作文件的进程没有获得锁时,可以打开,但无法执行read、write操作。

    fcntl函数:   获取、设置文件访问控制属性。

           int fcntl(int fd, int cmd, ... /* arg */ );

           参2:

                  F_SETLK (struct flock *) 设置文件锁(trylock)

                  F_SETLKW (struct flock *) 设置文件锁(lock)W --> wait

                  F_GETLK (struct flock *) 获取文件锁

           参3:

            struct flock {

                  ...

                  short l_type;          锁的类型:F_RDLCK 、F_WRLCK 、F_UNLCK

                  short l_whence;       偏移位置:SEEK_SET、SEEK_CUR、SEEK_END

                  off_t l_start;            起始偏移:1000

                  off_t l_len;             长度:0表示整个文件加锁

                  pid_t l_pid;            持有该锁的进程ID:(F_GETLK only)

                  ...

             };

    进程间文件锁示例

    多个进程对加锁文件进行访问:                    

    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    void sys_err(char *str)
    {
        perror(str); exit(1);
    }
    int main(int argc, char *argv[])
    {
        int fd;
        struct flock f_lock;
    
        if (argc < 2) {
            printf("./a.out filename
    "); exit(1);
        }
        if ((fd = open(argv[1], O_RDWR)) < 0)
            sys_err("open");
    
        //f_lock.l_type = F_WRLCK;        /*选用写琐*/
        f_lock.l_type = F_RDLCK;          /*选用读琐*/ 
    
        f_lock.l_whence = SEEK_SET;
        f_lock.l_start = 0;
        f_lock.l_len = 0;               /* 0表示整个文件加锁 */
    
        fcntl(fd, F_SETLKW, &f_lock);
        printf("get flock
    ");
        sleep(10);
    
        f_lock.l_type = F_UNLCK;
        fcntl(fd, F_SETLKW, &f_lock);
        printf("un flock
    ");
    
        close(fd);     return 0;
    }        

    运行结果:

    ubuntu1604@ubuntu:~/wangqinghe/linux/20190821$ ./file_lock sem_pro.c

    get flock

    un flock

    依然遵循“读共享、写独占”特性。但!如若进程不加锁直接操作文件,依然可访问成功,但数据势必会出现混乱。

    【思考】:多线程中,可以使用文件锁吗?

    多线程间共享文件描述符,而给文件加锁,是通过修改文件描述符所指向的文件结构体中的成员变量来实现的。

  • 相关阅读:
    0diff算法参考资料
    js 对象属性值
    一些带有设计模式的优秀代码
    vue 配置多页面
    cms 管理系统
    网络技术:EtherChannel 链路汇聚
    网络技术:VLAN 中继协议(VTP)
    网络管理:管理信息库
    网络管理:抽象语法表示 ASN.1
    网络管理:基本编码规则(BER)
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11389856.html
Copyright © 2011-2022 走看看